【问题标题】:Questions about strcpy overflows关于strcpy溢出的问题
【发布时间】:2014-05-14 02:48:27
【问题描述】:

我正在使用这样的简单主程序

#include <string.h>

int main(int argc, char **argv)
{
        char buf[256];
        strcpy(buf, argv[1]);
}

我知道如果编译,这个 main 将产生值为 1 的 'argc',并且 argv[1] 将不存在这个程序中定义的。然而,由 argv[1] 表示的内存地址,虽然没有在这个程序中定义,但不会被程序修改,因为 argv[1] 是作为 const char * 传递的。所以我的问题是为什么 strcpy 不能抓取这个字符并将其写入 buf?还有,为什么 argc = 1?

【问题讨论】:

  • 如果是,为什么你认为argv[1] 不存在?
  • 你可能想先学习Command line argument。希望你能自己得到答案。
  • printf("%i\n", argc) 显示 1
  • 那么,argv[1] 会是?
  • constargv 无关。该标准支持修改它以及它所承载的字符串(尽管它可能看起来很奇怪)。无论如何,argv[N] 仅被定义为在[0..(argc-1)] 中为所有N 公开一个有效的非空地址。该标准还要求argv[argc] 应为空指针。 (C §5.1.2.2.1,第 2 段)。换句话说,您使用 NULL 源地址调用 strcpy,这会调用 未定义的行为

标签: c argv strcpy argc


【解决方案1】:

问:所以我的问题是为什么 strcpy 不能抓取这个 {argv[1]} 字符并将其写入 buf?

你可以。您可能遇到的唯一问题是argc 小于 2,或者 argv[1] 大于 255 个字节(加上字符串终止字符)。

问:另外,为什么 argc = 1?

在大多数系统上,argv[] 数组的布局具有相同的布局。 例如,假设从命令行执行了一个程序:

>./myprog cookie monster

argv[0]    Contains the path where the executing program resides in the filesystem.
           So the actual value is something like: '/home/mahonri/test/test'
           This value is provided by the operating system.

argv[1]    Will contain the string: 'cookie'
           This value is provided (optionally) by the user.

argv[2]    will contain the string: 'monster'
           This value is provided (optionally) by the user.

argc       will be '3', because there are three argv elements; 0, 1 and 2.

在问题代码的情况下,如果argc为'1',那么只有argv[0]被初始化;如果代码随后尝试访问 argv[1] 或 argv[2],将会发生不可预知的事情。

【讨论】:

  • 如果 argc 为 1,则 argv[1] is 也已初始化,但为 NULL
【解决方案2】:

您的问题“所以我的问题是为什么 strcpy 无法获取此 char 并将其写入 buf”的简单答案是 argv[1] 不被视为常量 char *,正如您所提到的,但它将是一个 NULL 指针,见 C §5.1.2.2.1,第 2 段。在您的情况下,将发生未定义的行为。

至于“为什么 argc = 1?”值得关注,这取决于您传递的参数数量。命令行参数非常基础。做个研究。

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多