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

C语言调用stdlib.h的system()运行java jar时无法读取argv[2]求助

问题根因分析
  • 核心问题1:非法修改argv指向的字符串,导致argv[2]被截断
    C语言中main函数的argv数组指向的字符串是操作系统传入的只读内容,且在内存中是连续存储的。你调用strcat(option, space)时,option是argv[1]的指针,strcat会在argv[1]原字符串的末尾\0位置写入空格,再新增一个\0,这个新增的\0刚好覆盖了argv[2]字符串的首个字符,导致读取argv[2]时直接识别为空字符串,这就是arg2缺失的直接原因。
  • 核心问题2:command数组缓冲区溢出,存在未定义行为
    你定义char command[] = "java -jar lans.jar ";时,数组的长度刚好等于初始字符串的长度+1(末尾\0),没有预留任何拼接其他参数的空间,后续调用strcat拼接内容会直接越界写入,属于典型的缓冲区溢出漏洞,会导致不可预期的程序行为。
    额外隐患:直接使用printf(command)也存在格式化字符串注入风险,如果参数中包含%类占位符会导致程序崩溃。
修复方案
  1. 禁止修改argv指向的字符串,所有参数拼接操作都在专门申请的缓冲区内完成
  2. 给command缓冲区分配足够的空间,优先使用更安全的snprintf做字符串拼接,避免手动操作strcat容易出现的边界错误
  3. 修复后示例代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    // 分配1024字节的缓冲区,足够容纳普通传参
    char command[1024] = "java -jar lans.jar ";
    int cmd_len = strlen(command);

    if (argc == 2)
    {
        snprintf(command + cmd_len, sizeof(command) - cmd_len, "%s", argv[1]);
        printf("%s\n", command);
        system(command);
    }
    else if (argc == 4)
    {
        snprintf(command + cmd_len, sizeof(command) - cmd_len, "%s %s %s", argv[1], argv[2], argv[3]);
        printf("%s\n", command);
        system(command);
    }
    else
    {
        printf("wrong args\n");
        system(command);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 04:39:03