0

私はこのコードを試しています:

imei=Found_imei(pClient->GetBuffer());
printf("6. CODICE IMEI %s \n",imei); 
pClient->SetImei(imei);
printf("6.1 CODICE IMEI %s \n",pClient->GetImei());
free(imei); <<<<<<<<<<<<<<
printf("6.2 CODICE IMEI %s \n",pClient->GetImei());

どこ

char *Found_imei(char *string) 
{
char *start;
char *end;
char str[40];
int l;

start=strstr(string,"imei:");

strstr(start,",");

l=end-start-5;
strncpy(str,start+5,l);
str[l]='\0';
return strdup(str); <<<<<<<<<<<<<<<<< 
}

free コマンドの後、printf でエラーが発生しました。

strdup と free の使用でエラーが発生していますか?

ありがとう

4

3 に答える 3

1

私が見るいくつかの明らかな問題:

  1. の戻り値strstr(start,",");は無視され、その関数呼び出しは役に立たなくなります
  2. end関数内で初期化されることはないFound_imeiため、ポインター演算l=end-start-5;は未定義の動作になります
  3. strncpy常にその出力を null で終了するとは限りません。これにより、文字列の端から外れて未定義の動作に陥る可能性があります。
  4. 実際にバッファ サイズから 1 を引いた値を渡す必要がある場合にl、長さパラメータとしてを渡しています。40 以上の場合は、あまりにも多くの文字をコピーしてスタックを破壊することになります。strncpylstr

問題 1 と 2 は、正確なコードをコピーして貼り付けられなかった結果であると思われますend = strstr(start,",");。とはいえ、問題 3 と 4 は依然として深刻な問題です。

于 2013-11-18T22:56:38.397 に答える