You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言代码异常跳过RequestCounter累加语句 运行结果不符合预期

问题根因
  • 循环变量未初始化:for(int z; z < UsernameSize; z++)中的局部变量z未赋值,初始值为栈内存随机垃圾值,循环次数不可控,直接导致Request数组越界写入。
  • 用户名长度计算错误:UsernameSize = sizeof(Username);取的是整个数组的固定长度255,而非从文件读取到的用户名实际长度,应该用strlen(Username)获取实际长度。
  • 数组越界篡改全局变量:Request数组仅定义了255字节长度,初始化的curl固定字符串已经占用了104字节,再写入255字节的内容必然越界,越界写入的数据会直接覆盖内存中相邻存储的RequestCounter、UsernameSize等全局变量的值,这就是你观察到累加语句没生效、变量值异常跳变的核心原因。
  • 补充隐患:未判断fopen返回值,文件不存在时会直接崩溃;fscanf未限制读取长度容易溢出;printf(Request)直接将用户可控内容作为格式串,存在格式化注入风险。
修复后代码
#include <stdio.h>
#include <string.h>

int UsernameSize;
int RequestCounter=104;
char Username[255];
// 扩大数组长度避免溢出
char Request[1024]="curl -X POST https://api.test.com/profiles/test -H 'Content-Type: application/json' --data-raw '['";
FILE *UsernamesFile;

int main() {
    UsernamesFile = fopen("Usernames.text","r");
    if (UsernamesFile == NULL) {
        printf("文件打开失败\n");
        return 1;
    }
    // 限制读取长度避免Username溢出
    fscanf(UsernamesFile, "%254s", Username);
    // 取用户名实际长度
    UsernameSize = strlen(Username);
    Request[RequestCounter]='"';
    RequestCounter++;
    // 初始化循环变量z为0
    for(int z=0; z < UsernameSize; z++) {
        Request[RequestCounter+z]=Username[z];
    }
    RequestCounter=RequestCounter+UsernameSize;
    Request[RequestCounter]='"';
    // 避免格式化注入
    printf("%s\n", Request);
    printf("%d\n",RequestCounter);
    fclose(UsernamesFile);
    return 0;
}

内容的提问来源于stack exchange,提问作者sumfoxdude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:36:03