通过 printf() 访问内存地址的值时出现 AddressSanitizer 错误
AddressSanitizer error while accessing value of a memory address though printf()
我参加了一个算法竞赛,在该竞赛中,我给出了一种方法来为 C 语言编码的问题编写算法。该方法如下所示:
int algorithm(char** grid, int gridSize, int* gridColSize)
{...}
如果我向服务器输入一个网格值:
[]
那我收到了"AddressSanitizer ERROR heap-buffer-overflow"
当我 printf() 值 gridColSize 如下所示:
printf("[%d]", gridColSize);
它打印:
[16]
如果我像下面这样打印然后内存错误显示在编辑器的终端
printf("[%d]", *gridColSize);
因为我无法访问服务器上的隐藏代码。我怎样才能检查和处理 grid 参数的输入值“[]”。
对于以下行和列值有效的输入,不会出现这种情况。如果行为零,列可能有有效值 >= 1,那么如何检查 gridColSize 地址是否为有效内存,并且我可以跳过该输入以返回有效输出?
我在互联网上看到过很多关于为什么会出现地址消毒程序问题的话题,但我知道当我无法访问主代码时我该如何处理这种情况。
有大神帮我解决一下吗?
how can I check the gridColSize address is a valid memory and I can skip that input for returning a valid output?
您无法检查给定非 NULL 指针指向的内存是否可以访问。
给定 API 个 algorithm
函数,您可以:
- 检查
grid
是否为 NULL
。
- 检查
gridSize
是否为 0。
- 检查
gridColSize
是否为 NULL
。
鉴于您选中了 3(gridColSize
是 16
)尝试检查 gridSize
。
这条语句:
printf("[%d]", *gridColSize);
正在请求打印地址(根据您的问题)16 处的值。
很可能地址 16 不是供您的程序使用的有效地址。
我参加了一个算法竞赛,在该竞赛中,我给出了一种方法来为 C 语言编码的问题编写算法。该方法如下所示:
int algorithm(char** grid, int gridSize, int* gridColSize)
{...}
如果我向服务器输入一个网格值:
[]
那我收到了"AddressSanitizer ERROR heap-buffer-overflow"
当我 printf() 值 gridColSize 如下所示:
printf("[%d]", gridColSize);
它打印:
[16]
如果我像下面这样打印然后内存错误显示在编辑器的终端
printf("[%d]", *gridColSize);
因为我无法访问服务器上的隐藏代码。我怎样才能检查和处理 grid 参数的输入值“[]”。
对于以下行和列值有效的输入,不会出现这种情况。如果行为零,列可能有有效值 >= 1,那么如何检查 gridColSize 地址是否为有效内存,并且我可以跳过该输入以返回有效输出?
我在互联网上看到过很多关于为什么会出现地址消毒程序问题的话题,但我知道当我无法访问主代码时我该如何处理这种情况。
有大神帮我解决一下吗?
how can I check the gridColSize address is a valid memory and I can skip that input for returning a valid output?
您无法检查给定非 NULL 指针指向的内存是否可以访问。
给定 API 个 algorithm
函数,您可以:
- 检查
grid
是否为NULL
。 - 检查
gridSize
是否为 0。 - 检查
gridColSize
是否为NULL
。
鉴于您选中了 3(gridColSize
是 16
)尝试检查 gridSize
。
这条语句:
printf("[%d]", *gridColSize);
正在请求打印地址(根据您的问题)16 处的值。
很可能地址 16 不是供您的程序使用的有效地址。