Ты тут не умничай, ты пальцем покажи, где здесь неправильный код: 
static int_fast8_t xcclk_unsol(char *text)
{
char *p, s[6], *msg;
int i;
struct tm *tm;
time_t t;
	/* AT+CLTS */
	#if defined(SIM900) || defined(SIM900B)
	if (!strncmp(text, "*PSNWID:", 8)) return -1;
	if (!strncmp(text, "DST:", 4)) return -1;
	if (!strncmp(text, "+CTZV:", 6)) return -1;
	if (!strncmp(text, "*PSUTTZ:", 8)) {
		writelog(LOG_INFO, MNAME "network time updated");
		if (cclk_S==CCLK_IDLE) cclk_S=CCLK_GET;
		return -1;
	}
	#endif
	/* parse +CCLK */
	if (strncmp(text, "+CCLK:", 6)!=0) return 0; /* не обработано */
	if (cclk_S!=CCLK_WAITTIME) return -1; /* время не запрашивалось */
	msg=strdup(text);
	do {
		/* allocate memory */
		tm=malloc(sizeof(struct tm));
		if (tm==NULL) {
			OUT_OF_MEMORY();
			free(msg);
			return -1;
		}
		/* parse answer, TODO нечоткий парсер! */
		p=strunquote(&text[6]);
		if (p==NULL) break;
		i=sscanf(p, "%u/%u/%u,%2u:%2u:%2u%5s",
			&tm->tm_year, &tm->tm_mon, &tm->tm_mday,
			&tm->tm_hour, &tm->tm_min, &tm->tm_sec,
			s);
		if (i<6) break;
		/* difference from UTC (15min. intervals) */
		if (i>6) {
			if (s[0]!='+' && s[0]!='-') break;
			if (sscanf(s, "%d", &i)!=1) break;
		}
		else i=0;
		/* fix year = 70..138 and month */
		if (tm->tm_year < 70) tm->tm_year+=100;
		tm->tm_mon--;
		/* validate time */
		if (tm->tm_hour<0 || tm->tm_hour>23) break;
		if (tm->tm_min<0 || tm->tm_hour>59) break;
		if (tm->tm_sec<0 || tm->tm_sec>60) break;
		if (tm->tm_year<70 || tm->tm_year>137) break;
		if (tm->tm_mon<0 || tm->tm_mon>11) break;
		if (tm->tm_mday<1 || tm->tm_mday>31) break;
		/* compute UTC time */
		tm->tm_isdst=0; /* no daylight saving! */
		t=timegm(tm);
		t-=i*15*60L;
		/* set new time */
		free(msg);
		writelog(LOG_INFO, "-- UTC %4.4u-%2.2u-%2.2uT%2.2u:%2.2u:%2.2u",
			tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
			tm->tm_hour, tm->tm_min, tm->tm_sec );
		free(tm); 
		if (labs(TIME(NULL) - t) > MAX_DIFF_SEC) {
			DEBUG0(MNAME "setting new time");
			stime_ignored=1;
			stime(&t);
			stime_ignored=0;
		}
		return -1;
	} while(0);
	free(tm);
	writelog(LOG_WARN, MNAME "incorrect +CCLK message: %s",
		(const char*)(msg==NULL ? "(out of memory)" : msg) );
	free(msg);
	return -1;
}
 
А я даже больше скажу. Если в ниже приведённом вместо xmalloc сразу звать malloc -- будет can't generate code в строке, где s->x+=s->c. Или если localtime заменить на malloc. Впечатлает?  Логика проф. уровня!
static void *xmalloc(size_t n)
{
        return (void*)(unsigned long)malloc(n);
}
static int_fast8_t cclk_unsol(char *text)
{
        struct s_1 { int x; char c; } *s;
        struct tm *tm = localtime(NULL);
        s=xmalloc(sizeof(struct s_1));
        s->x+=s->c;                              // тут ошибка при замене xmalloc-->malloc
        if (s->x<10) s->c++;
        if (tm->tm_year < 70) tm->tm_year+=100; // тут ошибка если localtime заменить на malloc
        tm->tm_mon--;
        return tm->tm_year+tm->tm_mon;
}
 
PS: да, ошибка вызывается в свою очередь такой же ошибкой в malloc ("can't generate code"), если там исправить -- всё ок. Логики никакой, сообщение об ошибке так и отдаёт профессиональностью.
[ZX]