Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;覆盖数组边界_C++_C - Fatal编程技术网

C++ C/C++;覆盖数组边界

C++ C/C++;覆盖数组边界,c++,c,C++,C,在覆盖数组绑定时,检测bug的好方法是什么 int a[100]; for (int i = 0; i<1000; i++) a[i] = i; inta[100]; 因为(inti=0;iValgrind将非常可靠地发现这类事情!Valgrind将非常可靠地发现这类事情! 静态代码分析(例如lint) 运行时内存分析(如valgrind) 避免固定大小的缓冲区,更喜欢动态大小的容器 尽可能使用sizeof()而不是幻数 静态代码分析(例如lint) 运行时内存分析(如valgrind

在覆盖数组绑定时,检测bug的好方法是什么

int a[100];
for (int i = 0; i<1000; i++) a[i] = i;
inta[100];

因为(inti=0;iValgrind将非常可靠地发现这类事情!

Valgrind将非常可靠地发现这类事情!

  • 静态代码分析(例如lint)
  • 运行时内存分析(如valgrind)
  • 避免固定大小的缓冲区,更喜欢动态大小的容器
  • 尽可能使用sizeof()而不是幻数
      • 静态代码分析(例如lint)
      • 运行时内存分析(如valgrind)
      • 避免固定大小的缓冲区,更喜欢动态大小的容器
      • 尽可能使用sizeof()而不是幻数

        • 使用std::vector,或者使用.at()-它总是检查范围,或者使用[]并在编译器中打开范围检查


          如果你是C++编译器,没有理由不使用STD::Vector。它不比数组慢(如果你关闭边界检查),你可以使用与siz()和[]]完全相同的循环。你不需要被复杂迭代器

          吓跑。使用一个STD::vector,或者使用.A.()-它总是检查范围或使用[]。并在编译器中启用范围检查


          <>编辑-----如果你是C++编译器,没有理由不使用STD::vector。它不比数组慢(如果你关闭边界检查),你可以使用与siz()和[]一样的完全相同的循环。你不需要被复杂迭代器

          吓到。这里有一些好的建议。 这里还有一些,特别是对于C风格的代码,而不是C++:

          • 避免使用某些不安全的字符串和内存函数。特别是,如果函数写入缓冲区并且不允许您指定大小,请不要使用它。

            要避免的函数示例有:
            strcpy
            strcat
            sprintf
            get
            scanf(“%s”,ptr)
            。使用这些标记的任何地方都是红色标志。相反,请使用诸如
            memcpy
            strncpy
            (或者更好的是,
            strlcpy
            ,尽管不是到处都可用)、
            snprintf
            fgets

          • 在编写自己的接口时,您应该始终能够回答以下问题:我使用的缓冲区有多大?通常这意味着保留一个参数来跟踪大小,例如
            memcpy


            • 这里有一些好的建议

              这里还有一些,特别是对于C风格的代码,而不是C++:

              • 避免使用某些不安全的字符串和内存函数。特别是,如果函数写入缓冲区并且不允许您指定大小,请不要使用它。

                要避免的函数示例有:
                strcpy
                strcat
                sprintf
                get
                scanf(“%s”,ptr)
                。使用这些标记的任何地方都是红色标志。相反,请使用诸如
                memcpy
                strncpy
                (或者更好的是,
                strlcpy
                ,尽管不是到处都可用)、
                snprintf
                fgets

              • 在编写自己的接口时,您应该始终能够回答以下问题:我使用的缓冲区有多大?通常这意味着保留一个参数来跟踪大小,例如
                memcpy


              编写单元测试并在下运行。在单元测试级别,这样的错误相对容易捕获

              覆盖数组末尾是一种未定义的行为,因此编译器不需要发出诊断


              一些静态分析工具可能会有所帮助,但有时会发出错误警报。

              编写单元测试并在其下运行。这样的错误在单元测试级别相对容易发现

              覆盖数组末尾是一种未定义的行为,因此编译器不需要发出诊断


              一些静态分析工具可能会有所帮助,但有时会发出错误警报。

              只需为数组动态分配内存,并使用异常处理来确定是否有足够的空间。

              只需为数组动态分配内存,并使用异常处理来确定是否有足够的空间。

              使用STL contain时像
              vector
              这样的工具是最好的,有一些方便的习惯用法可以用来控制这类东西,比如我经常使用的这个

              int a[100];
              const size_t A_SIZE = sizeof(a) / sizeof(*a);
              
              for ( int i = 0; i < A_SIZE; ++i )...
              
              inta[100];
              常量大小=大小(A)/大小(*A);
              对于(int i=0;i
              虽然使用STL容器(如
              vector
              )是最好的,但是有一些方便的习惯用法可以用来控制这类事情,比如我经常使用的这个

              int a[100];
              const size_t A_SIZE = sizeof(a) / sizeof(*a);
              
              for ( int i = 0; i < A_SIZE; ++i )...
              
              inta[100];
              常量大小=大小(A)/大小(*A);
              对于(int i=0;i在C++中使用<代码> STD::vector < /Cord>,并确保实现具有绑定检查指令(或使用<代码> STD::vector::< /COD>)@小船:你需要决定你是否使用C或C++。尽管它们的语法相似,但实际上是不同的语言,它们有不同的范式和风格。C中的好的实践,在C++中常常被人所怀疑,我怀疑它是相反的。好点。但是,你经常继承使用上面结构的代码,所以我想。ESS我正在寻找捷径来调试这种问题。下面的建议使用ValGRD绝对值得尝试。在C++中使用<代码> STD::vector < /代码>,并确保实现具有绑定检查指令(或者使用<代码> STD::vector::<代码/ >)@小船:你需要决定你是否使用C或C++。尽管它们的语法相似,但实际上是不同的语言,它们有不同的范式和风格。C中的好的实践,在C++中常常被人所怀疑,我怀疑它是相反的。好点。但是,你经常继承使用上面结构的代码,所以我想。我一直在寻找调试此类问题的快捷方式。下面使用valgrind的建议绝对值得一试。请注意,
              std::vector
              仅适用于