クロノの提案に従って、コメントから回答を作成しました。
バッファ オーバーフローの脆弱性
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()
を忘れないでください。