#c #buffer-overflow
#c #переполнение буфера
Вопрос:
Я получаю информацию о переполнении буфера из appscan для приведенного ниже набора кода. Я не уверен, что в этом не так. Если кто-нибудь предложит решение, это было бы здорово. Общий код предназначен для всей платформы.
int main()
{
char* src = NULL;
char* chenv = getenv("HOME");
if (chenv == NULL || strlen(chenv) == 0)
return -1;
else
{
int len = strlen(chenv);
src = new char[len 1];
strncpy(src, chenv, len); // AppScan throws buffer overflow
src[len 1]='';
}
FILE* fp;
char content[4096];
int len = 0;
fp = fopen("filename.txt", "r");
if(fp)
{
while( (len = fread(content, sizeof(char), sizeof(content), fp))> 0) // AppScan throws buffer overflow on content
{
docopy(content, len);// External funtion call.
}
}
return 0;
}
Комментарии:
1. @Evg В коде используется оператор C
new
, поэтому я предполагаю, что это на самом деле C .2. @IanAbbott, правильно…
3.
src[len 1]='';
должно бытьsrc[len]='';
.4. Мне действительно не нравится это предупреждение об усечении stringop. В любом случае, простое решение первого предупреждения — просто использовать
std::string
, что вам, вероятно, следовало бы делать в любом случае. Согласитесь, что неясно, в чем его проблема сfread
. Что произойдет, если вместо этого вы просто используете plainread
илиstd::istream::read
?5. Я не понимаю новообретенной популярности
strncpy
. Это подвержено ошибкам. В коде, о котором идет речь, размер копируемой строки известен, выделен достаточно большой буфер, которыйstrcpy
будет делать именно то, что необходимо. Этот танецstrncpy
с длиной, которая меньше фактического буфера, за которым следует заполнение нулевого ограничителя (даже если код был исправлен, чтобы поместить его в правильное местоположение), здесь бессмыслен.
Ответ №1:
Вместо strncpy я попытался использовать strdup() и проблема была решена. Но у fread все еще возникает проблема.