gpt4 book ai didi

c - 如何在这个函数中正确使用断言?

转载 作者:太空宇宙 更新时间:2023-11-04 05:50:09 24 4
gpt4 key购买 nike

我有以下功能,我在几个地方使用了 assert。我想知道我在哪里以错误的方式使用断言以及为什么。第一个是错误的,因为我们不能对用户输入使用断言。第二个:我们可以使用断言来检查malloc是否成功吗?其余的我仍然无法弄清楚为什么。你能帮忙吗?我想要一个简短的解释为什么 assert 在给定的地方是好的还是坏的。

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <malloc.h>

#define num 10
int hh(char *);

最佳答案

你定义什么是对什么是错,所以这取决于你,但作为一般规则,你不希望你的程序逻辑在断言中(因此检查输入字符串的长度是一种不好的用途)。

请记住:断言仅在 Debug模式下有效,因此如果您依赖它进行错误检查(就像您几乎所有的示例一样),您将在 Release模式下发生奇怪的事情。

即断言通常是一个定义,如:

/* assert() only does something if NDEBUG is NOT defined */
#ifdef NDEBUG
#else
#define assert(x) _assert(x)
#endif

参见 Where does the -DNDEBUG normally come from?有关 NDEBUG 的更多信息

您绝对不想使用断言来更改流程,例如

assert(some_function()); /* some_function only called if NDEBUG is not defined */

使用 assert 检查 malloc 的返回:如果未定义 NDEBUG,则不会进行检查,因此理论上您可以离开并访问 NULL 指针。我会说这不安全。参见 Handling error checking with assert更多讨论。

让我们通过简单的“仅在调试中”过滤器一一查看您的断言:

assert(argc==2);
/*
* If NDEBUG is defined and argc == 1 you get through,
* so anything that uses argc[1] will give undefined behavior.
* = BAD USE
*/
char *s = malloc(N);
/* 2 */
assert(s!=NULL);
scanf("%s", s
/*
* If NDEBUG is defined and malloc fails you keep going and read into
* NULL = undefined behaviour = BAD
*/

assert(strlen(s)<N);
/*
* If NDEBUG is defined keeps going even in strlen >= N.
* How bad that is depends on the code - if you are checking the size
* before putting it in a buffer, then it's bad.
* To me it is logic in the assert and so I say BAD
*/
/* 4 */
assert(!*(s+strlen(s)));
/*
* First of that's just silly code.
* If that comes to my code review you'll be removing or rewriting
* it - strlen relies on the NUL, so how can it fail?
* It is logic in the assert - If NDEBUG is set you'll keep going
* even if the condition is not met. How bad that is?
*/
/* 5 */
assert(atol(s));
/*
* Whoa. If NDEBUG is set and s = "Hello" we still keep going...
* What is atol("Hello") ?
*/
printf("%ld\n", 100000000/atol(s));
free(s);
return 0;
}
int f(char *s)
{
/* 6 */
assert(s!=NULL);
/*
* Again if NDEBUG is defined the check disappears and so if s = NULL
* then you dereference a NULL pointer which is undefined behavior
*/
return !*s;

关于c - 如何在这个函数中正确使用断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44037553/

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