C++ C/C++;覆盖数组边界
在覆盖数组绑定时,检测bug的好方法是什么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
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
仅适用于