未定义的行为[英] Undefined Behavior

问题描述

为什么这段代码会导致未定义的行为?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0
#define MAX_PASSWORD 11
内循环;
无符号字符 rx;
int _strlen(s)
无符号字符s[];
{
诠释我;

我=0;
while(s[i]!=''\0'')
++i;
返回我;
}

int 加密 (s, x, len)
无符号字符 *s ;
无符号字符 x;
国际化;
{

我,好的;
unsigned char seed_1,seed_2;

种子_1 = rx;
种子_2 = rx + 31;
确定 = 真;
for(i = 0 ; i < len ; i++)
{
种子_1 -= i;
种子_2 += i;
如果(i%2 != 0)
s[i] -= 种子_1;
其他
s[i] += 种子_2;
if(s[i] == ''&'' || s[i]== ''\0'' || s[i] == ''\n'')
确定 = 错误;
}
if (x == ''&'')
确定 = 错误;
返回确定;
}

int 解密 (s, len)
无符号字符 *s;
国际化;

{
无符号字符种子_1,种子_2;
诠释我;

种子_1 = rx;
种子_2 = rx+31;
对于 (i = 0; i < len ; i++)
{
种子_1 -= i;
种子_2 +=i;
如果 (i % 2 != 0)
s[i] += 种子_1;
其他
s[i] -= 种子_2;
}
返回真;
}

int encrypt_string (s)
无符号字符 *s ;
{

无符号字符 x;
int c, len;

x=0;
c=假;
len= _strlen(s);

while( c!= FALSE || 循环>0)
{
x++;
c=加密(s, x, len);
循环——;
}
s[len++] = x;
s[len++] = rx;
s[len]= ''\0'';

返回真;
}
int decrypt_string(s)
无符号字符 *s;
{

无符号字符 x,y ;
国际化;

len = _strlen(s)-1;

rx=s[len];
len--;
x=s[len];
for(y = 0; y < x ; y++)
解密(s, len);
s[len]= ''\0'';

返回真;
}
int main() {

无符号字符 *s;
unsigned char endchar;
无符号整数 y;
国际化;
s=(unsigned char *) calloc(MAX_PASSWORD, sizeof(unsigned char));
如果(s==NULL){
printf("无法分配内存");
返回0;
}

fgets(s,MAX_PASSWORD,stdin);
len=_strlen(s);

endchar =s[len-1];

if(endchar==''\r'' || endchar==''\n'')
s[len-1]=''\0'';

rx=strlen(s) ;
循环=1;

y=encrypt_string(s);

如果(y==真)
printf("\n\n加密字符串:%s ######%d\n\n",s,_strlen(s));

y=decrypt_string(s);
如果(y==真)
printf("解密字符串: %s %d\n",s,_strlen(s));

if(*s=!NULL){
免费;
s=NULL;
}
其他
printf("无法释放内存\n");
返回0;

}

推荐答案

bb****@gmail.com 说:
为什么这段代码会导致未定义的行为?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0
#define MAX_PASSWORD 11
内循环;
无符号字符 rx;
int _strlen(s)
入侵实现命名空间.

--
理查德·希思菲尔德
"Us.net 是个奇怪的地方"- dmr 29/7/1999
http://www.cpax.org.uk
电子邮件:rjh 在上述域,- www.

在文章 <11***************************@r35g2000prh.googlegroups .com>,
<bb****@gmail.com 写道:
>#define MAX_PASSWORD 11
s=(unsigned char *) calloc(MAX_PASSWORD, sizeof(unsigned char));
如果(s==NULL){
printf("无法分配内存");
返回0;
}

fgets(s,MAX_PASSWORD,stdin);
len=_strlen(s);
这是什么_strlen()?二话不说,这是一个保留
名称.
>
endchar =s[len-1];

if(endchar==''\r'' || endchar==''\n'')
s[len-1]=''\0'';
所以此时 s 指向一个最长为 11 个字节长的字符串(包括
最后的 nul)在一个 11 字节长的缓冲区中.
y=encrypt_string(s);
>int encrypt_string (s)
……
s[len++] = x;
s[len++] = rx;
s[len]= ''\0'';
哎呀!你在 s 的末尾添加东西,并且溢出了
缓冲区.

你应该能够自己发现这样的错误,使用
valgrind等内存检查工具.

-- 理查德
--
"需考虑最多32个字符
在某些字母表中"- X3.4,1963 年.

bb****@gmail.com 写道:
>
为什么这段代码会导致未定义的行为?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0
#define MAX_PASSWORD 11
内循环;
unsigned char rx;

int _strlen(s)
无符号字符s[];
{
因为在这里你使用了一个为
保留的标签执行.不要那样做.

--
<http://www.cs.auckland.ac.nz/~pgut001/pubs/vista_cost.txt>
<http://www.securityfocus.com/columnists/423>
<http://www.aaxnet.com/editor/edit043.html>
cbfalconer 在 maineline.net

--
通过 http://www.teranews.com
的免费 Usenet 帐户发布

本文地址:https://www.itbaoku.cn/post/1050589.html