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

根据 Chrono 的建议,我从我的评论中做出了回答:

缓冲区溢出漏洞

如果你分配 100 个字节作为 I/O 缓冲区,你应该告诉填充它的函数:

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

看来您有一个配置 where sizeof(long) == 4(即 32-bit long)。您可能想查看strtoull()/strtoll()而不是strtoul()/ strtol(),并使用[unsigned] long long变量来代替......

编辑:实际上,别介意[unsigned] long long一点,因为你已经有了uint64_t......

于 2013-07-16T17:47:20.353 回答
-1

似乎strtol超出范围(根据limits.h和 的定义, 0xffffffff 或更大是 ULONG_MAX strtol)。尽管传递的值(8105b4a5)小于 0xffffffff,但它大于 LONG_MAX(取决于系统),这是strtol可以处理的最大数字。

由于您使用的是 unsigned longs,因此该函数strtoul(请参阅定义)可能是更合适的候选者。

为确保是因为这个范围问题,请检查您当地的limit.h。

希望有效。

*约斯特

于 2013-07-16T09:49:27.673 回答