Я скомпилировал код на своем Mac с флагом оптимизации GCC -O3
, чтобы ускорить время выполнения. Это отлично работает на моей локальной машине и приводит к увеличению скорости на 2/3.GCC Оптимизация: ошибка, вызванная fgets
Однако я попытался скомпилировать код на Amazon EC2, так как я имею дело с большим набором данных. Использование флага оптимизации -O3
вызывает следующее предупреждение
предупреждения: призыв к «__fgets_chk_warn» объявлено с предупреждением атрибута: fgets вызывается с большим размером, чем длина буфера назначения
В соответствующей функции, текстовый файл анализируется по строкам. Тем не менее, я не совсем понимаю, почему я получаю предупреждение. Код функции выглядит следующим образом:
int loadPriceData(const char *filename, double *target) {
char line[40];
FILE *fp;
fp = fopen(filename, "r");
if (fp == NULL) {
return -1;
}
int i = 0;
while (fgets(line, 80, fp) != NULL) {
sscanf(line, "%lf\n", target + i);
i += 1;
}
fclose(fp);
return i; // Return number of elements
}
target
является указателем на массив с 10000
элементов по умолчанию. Количество записей неизвестно заранее, но возвращается функцией.
'40 <80'. Не кажется слишком загадочным. – EOF
Проблема в том, что строка представляет собой массив из 40 байт, но вы говорите, что у него 80 байт. Используйте sizeof (line) вместо 80. –
Давайте продолжим предупреждение: 'fgets вызывается с большим размером (что составляет 80), чем длина буфера назначения (что равно 40)' – alk