gpt4 book ai didi

c++ - 如何观察放卷不当?

转载 作者:行者123 更新时间:2023-11-28 05:40:45 25 4
gpt4 key购买 nike

我们有一些 c++ 代码可以通过用户 API 调用 exit(3)。我的假设是我们没有正确展开堆栈,这在 c++ 中被认为是不好的。还有一个很大的 c++ 库,必须被认为是一个黑盒子。

我想打补丁,也知道如何打补丁,但不知道如何观察和比较变化。我能让它以某种方式可见吗?可能在 OS X 上?

最佳答案

exit() 显然做了一些清理工作。这在标准的第 18.5 节 [support.start.term] 中进行了描述,但经常正确的站点 www.cplusplus.com总结一下。

所以它说具有静态存储或线程存储的对象将被清理,整个 I/O 系统也将被清理(文件将被刷新等)。

但还有其他方法可以退出 C++ 清理。例如,如果它是一个调用 exitlibrary 并且它是一个 C 语言库(不是 C++),那么它可能会也可能不会执行 C++ 清理。或者调用 abortquick_exit。而且,如果您直接调用操作系统(例如,Windows 上的 ExitProcess()),则进程会立即退出并且不会完成 C++ 清理。

如果你想让行为可见:创建一个带有析构函数的对象,它可以做一些有趣的事情——比如在某处记录一条消息。或者,当它被构造时,它会创建一个具有特定名称的文件,而当它被破坏时,它会删除它。在您的 main() 中声明此对象的实例。在静态范围内声明另一个(带有不同的消息)。所以现在您可以在您的环境中观察到效果。

以下摘自N4140(2014-10-07)18.5:

[[noreturn]] void exit(int status) 
8 The function exit() has additional behavior in this International Standard:
(8.1) First, objects with thread storage duration and associated with the current
thread are destroyed. Next,objects with static storage duration are destroyed
and functions registered by calling `atexit` are called. See 3.6.3 for the
order of destructions and calls. (Automatic objects are not destroyed as a
result of calling `exit()`.) If control leaves a registered function called by
`exit` because the function does not provide a handler for a thrown exception,
`std::terminate()` shall be called (15.5.1).
(8.2) Next, all open C streams (as mediated by the function signatures declared in
`<cstdio>`) with unwritten buffered data are flushed, all open C streams are
closed, and all files created by calling `tmpfile()` are removed.
(8.3) Finally, control is returned to the host environment. If `status` is zero or
`EXIT_SUCCESS`, an implementation-defined form of the status _successful
termination_ is returned. If `status` is `EXIT_FAILURE`, an implementation-
defined form of the status _unsuccessful termination_ is returned. Otherwise
the status returned is implementation-defined.

关于c++ - 如何观察放卷不当?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37145149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com