0

関数を使用strtolして、ファイルのそのような行から長い値を解析すると、

ffffffff8105b4a5 t send_signal

!!!ffffffffの代わりに返されるだけです。ffffffff8105b4a5

コードは次のとおりです。

 uint64_t value1;
 uint64_t value2;
 char *temp = (char *) malloc(100);
fgets(temp,512, fp);
strncpy(line1,temp,16);
value1 = strtol(line1,NULL,16);
printf("str_hex1 = %x\n",value1);
printf("str_hex2 = %x\n",value2);
4

3 に答える 3

2

クロノの提案に従って、コメントから回答を作成しました。

バッファ オーバーフローの脆弱性

I/O バッファーとして 100 バイトを割り当てる場合は、それを埋める関数にそれを伝える必要があります。

char *temp = malloc(100);
fgets(temp, 100, fp);

または、戻る前にそのバッファを破棄した場合:

char temp[100];
fgets(temp, sizeof(temp), fp);

不要なコピー

なぜ単純に

strtol(temp, NULL, 16);

文字列を使用fscanf(3)してフォーマットし、ストリームを解析する

次のような行を解析するには

ffffffff8105b4a5 t send_signal

私は似たようなことを書きます

#include <inttypes.h>

int rv;
uint64_t col1;
char col2;
char col3[64];

rv = fscanf(fp, "%"SCNx64" %c %63s", &col1, &col2, col3);
if (rv != 3) {
    /* error treatment */
}

fgetsこれは、一連の、strtoulおよびよりもはるかに簡潔ですstrcpy。また、FILE*バッファを直接操作するため、いくつかのメモリ コピー操作を節約できます。

さらに、 のような状況ではcol3、GNU (および今後の POSIX.1)*scanfには、文字列に必要なバッファーを割り当てる変換形式拡張機能"%ms"があるため、その必要はありません (また、バッファー オーバーフローに遭遇することもありません)。ただし、それを呼び出すことfree()を忘れないでください。

于 2013-07-17T12:03:02.513 に答える
1

sizeof(long) == 4(つまり 32-bit )の構成があるように見えますlongstrtoull()/strtoll()の代わりにstrtoul()/を調べて、代わりに変数strtol()を使用することをお勧めします...[unsigned] long long

編集:実際には、[unsigned] long longあなたがすでに持っているように、少し気にしないでくださいuint64_t...

于 2013-07-16T17:47:20.353 に答える
-1

範囲外のようです ( limits.hと の定義strtolによると 0xffffffff 以上は ULONG_MAXです)。渡された値 (8105b4a5) は 0xffffffff よりも小さいですが、LONG_MAX (システムに依存) よりも大きいため、処理できる最大の数値です。strtolstrtol

unsigned long を使用しているため、関数strtoul(定義を参照) がより適切な候補である可能性があります。

この範囲の問題が原因であることを確認するには、ローカルの limit.h を確認してください。

うまくいくことを願っています。

*ジョスト

于 2013-07-16T09:49:27.673 に答える