-3

私は最近、2 つの環境変数を取り、それらを文字列に挿入し、文字列を popen に送信するプログラムを作成しました。ほとんどの場合は正常に動作しますが、何らかの理由でランダムに実行されないことがよくあります。だから、誰かが私が犯している可能性のあるエラーや間違いを見たかどうか疑問に思っていましたか?

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

int main(int argc, char *argv[], char *envp[]) {

   char *output;
   char *ccode;
   char *command;
   char *log;

   command = malloc(1024);
   log = malloc(1024);
   const char *parg = getenv("MCEXEC_ARGS");
   const char *pname = getenv("MCEXEC_PLAYERNAME");

   if(strcmp(parg,"")==0) {
       output = "Usage: /staff <message>";
       printf( "%s\n", output );
       return 0;
   }

   freopen("/dev/null","w",stdout);

   if (argv[1] == NULL) {
       snprintf(command, 1024,
                "/home/minecraft/remoteclient01a.py 'sendmsgtogroup staff §f(§bSTAFF§f) <%s§f> %s'",
                pname, parg);
       snprintf(log, 1024,
                "/home/minecraft/remoteclient01a.py 'savetolog info staffmsg: <%s> %s'",
                pname, parg);
   }
   else if (strcmp(argv[1],"me")==0) {
       snprintf(command, 1024,
                "/home/minecraft/remoteclient01a.py 'sendmsgtogroup staff §f(§bSTAFF§f) * %s§f %s'",
                pname, parg);
       snprintf(log, 1024,
                "/home/minecraft/remoteclient01a.py 'savetolog info staffmsg: * %s %s'",
                pname, parg);
   }

   popen(command, "w");
   popen(log, "w");

   free(command);
   free(log);

   return 0;
}
4

1 に答える 1

3

上手 ...

  • あなたはそれmalloc()が成功することをチェックしていません。
  • 環境変数が存在しない可能性があることを処理していません。
  • strcmp()NULLである可能性のあるポインターを呼び出しています。それはあなたのプログラムをすぐに殺すかもしれません。
  • ファイルを開くことが成功したことを確認していません。
  • コマンド文字列に奇妙な§文字が含まれていますが、それらが意図されているかどうかはわかりません。
  • popen()成功したかどうかはチェックしていません。
  • popen()私はあなたの使用法が意味をなさないと思います。一度開いたパイプは使用していません。
于 2012-05-22T14:31:02.787 に答える