Tag: 溢出

为什么strcpy()导致缓冲区溢出时没有分段错误?

#include #include #include void main() { char *a = “aaaaaaaaaaaaaaaa”; char b[1]; strcpy(b, a); printf(“%s\n”, b); } 运行时,它会打印: aaaaaaaaaaaaaaaa 如果我做一个超长的,例如,* a =“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”,那么它将导致段错误。 为什么第一种情况没有溢出?

检测输入中的整数溢出

在C或C ++中是否有办法检查用户提供的数字是否超出整数类型的范围? 例如,让我们假设我们使用的是16位有符号整数,范围为-32768到32767。 如果用户输入55555进入程序,这将被包装成一个负数,这样如果你使用的函数可以接受任何数字,结果将是错误的。 在C或C ++中是否有办法确定用户提供的数字是否在整数类型的范围内? 更新:我在一个简单的减法程序中使用数字,它接受两个数字并从第一个减去第二个数字。

C整数溢出

我正在使用C中的整数,试图更多地探讨溢出何时以及如何发生。 我注意到当我添加两个正数时,其总和溢出,我总是得到一个负数。 另一方面,如果我添加两个负数,其总和溢出,我总是得到一个正数(包括0)。 我做了一些实验,但我想知道这是否适用于每一个案例。

两个数字的LCM

我的LCM计划结果出错了。 如果找到数字的gcd,然后用gcd划分产品。 int gcd(int x, int y) { while(y != 0) { int save = y; y = x % y; x = save; } return y; } int lcm(int x, int y) { int prod = x * y; int Gcd = gcd(x,y); int lcm = prod / Gcd; return lcm; } 任何帮助非常感谢。

比较C或C ++中两个浮点值的总和

假设您有两组根据IEEE754实现的浮点变量,意味着将其视为根据标准中的公式计算的精确值。 所有合法价值都是可能的。 集合中的变量数量可以是任何自然数。 在数学意义上,比较精确的由所述变量表示的值的总和的好方法。 由于域的性质,问题可以很容易地表示为将单个总和与零进行比较。 您可以忽略存在NaN或无限的可能性,因为它与核心问题无关。 (可以轻松独立地检查这些值,并以适合此问题的特定应用的方式采取行动。) 一种天真的方法是简单地求和和比较,或者将一组的值和另一组的值相加。 bool compare(const std::vector& lhs, const std::vector& rhs) { float lSum = 0.0f; for (auto value : lhs) { lSum += value; } float rSum = 0.0f; for (auto value : rhs) { rSum += value; } return lSum < rSum; } 很明显天真方法存在问题,如关于浮点运算的各种其他问题中所提到的。 大多数问题都与两个困难有关: 浮点值的相加结果根据顺序而不同 添加某些值集的某些顺序可能导致中间溢出(计算的中间结果超出可用数据类型支持的范围) float small […]

C中va_list可能存在缓冲区溢出漏洞?

我有以下代码: int ircsocket_print(char *message, …) { char buffer[512]; int iError; va_list va; va_start(va, message); vsprintf(buffer, message, va); va_end(va); send(ircsocket_connection, buffer, strlen(buffer), 0); return 1; } 我想知道这个代码是否通过向变量列表提供大小> 512的char数组来缓冲溢出? 如果是这样 – 我该如何解决这个问题? 谢谢。

重复排列:避免溢出

背景: 鉴于n球,使得: ‘a’ balls are of colour GREEN ‘b’ balls are of colour BLUE ‘c’ balls are of colour RED … (当然a + b + c + … = n ) 可以安排这些球的排列数量由下式给出: perm = n! / (a! b! c! ..) 问题1:我如何“优雅地”计算perm以尽可能避免整数溢出,并确保当我完成计算时,我要么具有正确的perm值,要么我知道最终结果会溢出吗? 基本上,我想避免使用像GNU GMP这样的东西。 可选地,问题2:这是一个非常糟糕的主意,我应该继续使用GMP吗?

在程序中检测到缓冲区溢出,运行完美(显然)

在包含as,bs和cs的字符串上,我们可以执行以下操作。 我们可以取任意两个相邻的不同字符,并用第三个替换它们。 例如,’ab’减少为’c’,’ba’也减少为等等。 我写了这段代码,对t字符串执行以下操作(t <= 100),字符串的最大长度= 100 #include #include #include int redlen(char string[100][100], int x) { int g, checker; checker = 1; for(; checker; ) { checker = 0; for(int i = 0;string[x][i]!=’\0′; i++) { if((string[x][i]==’a’ && string[x][i+1]==’b’) || (string[x][i]==’b’ && string[x][i+1]==’a’)) { string[x][i]=’c’; checker = 1; for(g = i+1; string[x][g]!=’\0′; g++) { string[x][g]=string[x][g+1]; } […]

如何从C中的fgets中删除多余的字符输入?

我听说使用gets()在C编程中很糟糕,并且使用fgets更安全……所以我使用的是fgets。 但是,我遇到了fgets的问题:我输入了太多字符,不知怎的,它溢出了。 如何摆脱额外的输入字符? char answer[4]; char answer2[4]; fgets(answer,sizeof(answer),stdin); printf(“answer: %s\n”,answer); fgets(answer2,sizeof(answer2),stdin); printf(“answer2: %s\n”,answer2); 例如,对于第一个fgets,我输入123456,我得到的输出是 answer: 123 answer2: 456 如何删除456进入下一个fgets输入? 在为第一个fgets输入123456之后,我想要这样的输出: answer: 123 然后,用户继续输入下一个fgets的输入…

clang enum溢出

使用-Wall -pedantic #include #include int main(void) { enum x { a, max = INT_MAX, out_1 }; enum y { b, out_2 = INT_MAX + 1 }; printf(“%d %d\n”, out_1, out_2); return 0; } 铿锵回归 demo.c:9:3: warning: overflow in enumeration value out_1 ^ 正如您所看到的,编译器没有警告out_2溢出,他的值在编译时是未知的?