|
|
1
10
有一些基于运行时的解决方案检测代码以检查无效的指针访问。到目前为止,我只使用了mudflap(它自4.0版以来集成在gcc中)。mudflap尝试跟踪代码中的每个指针(和引用),并检查每个访问是否指针/引用实际指向其基类型的活动对象。下面是一个例子:
在启用mudflap的情况下编译:
跑步给你:
需要考虑的几点:
另一个需要考虑的问题是 非便携式 检查s()的复制构造函数,该构造函数断言值_u未绑定到寿命较短的整数(例如,如果*它位于它绑定到的整数所在堆栈的“较旧”槽中)。这是高度特定于机器的,当然可能很难正确处理,但是只要只用于调试就可以了。 |
|
|
2
4
我认为这不可能捕捉到所有这些,尽管有些编译器在某些情况下可能会发出警告。 还需要记住的是,参考资料实际上是引擎盖下的指针,许多可能带有指针的脚中射击场景仍然是可能的。 为了澄清我所说的“引擎盖下的指针”是什么意思,请学习以下两个课程。一个使用引用,另一个使用指针。
现在,比较生成的代码。
找出区别?没有了。 |
|
|
3
2
您必须使用基于编译时工具的技术。虽然valgrind可以在运行时检查所有函数调用(malloc,free),但它不能仅检查 代码 . 根据你的架构, IBM PurfyPrPull 找到其中一些问题。因此,您应该找到一个有效的许可证(或者使用您的公司许可证)来使用它,或者使用试用版进行尝试。 |
|
|
4
1
我认为任何静态工具都无法捕捉到这一点,但如果您使用 Valgrind 除了一些单元测试或者任何代码崩溃(SEG故障)之外,您可以很容易地找到内存的引用位置和最初分配位置。 |
|
|
5
1
你的代码甚至不应该编译。我所知道的编译器要么无法编译代码,要么至少发出警告。
如果你是说
重写和引入错别字只意味着我们不可能真正猜出你犯了什么错误。 询问 关于,哪些是我们应该忽略的事故。 当你在互联网上的任何地方发布问题时,如果该问题包含代码, 发布准确的代码 . 现在,假设这是一个打字错误,代码是完全合法的,没有理由 任何 工具应该警告您。 只要您不尝试取消对悬空引用的引用,代码是完全安全的。 一些静态分析工具(例如valgrind或msvc with/analyze)可能会警告您这一点,但似乎没有什么意义,因为您没有做错任何事情。您返回的对象恰好包含悬空引用。您不会直接返回对本地对象的引用(通常编译器 做 警告),但具有使其使用完全安全的行为的更高级别对象,即使它包含对超出范围的本地对象的引用。 |
|
|
6
1
在被这件事打败后,我遵循了一条准则:
通过这种方式,可以减少使用悬空引用逃离作用域的机会。 |
|
|
7
0
这是完全有效的代码。 如果调用函数并将临时对象绑定到常量引用,则作用域将延长。
这在 C++ standard . 见2.2.4:
和122.5:
|
|
|
Kris · 有没有办法获得可变结构字段的“引用” 4 年前 |
|
|
Jora Karyan · IF语句未按预期引发错误 4 年前 |
|
|
nedzad · 如何访问引用Firebase中其他对象的对象 8 年前 |
|
|
Empha · 从成员函数对对象所做的更改不会持续。范围/参考问题? 8 年前 |