если утверждение двусмысленность - PullRequest
2 голосов
/ 07 января 2012

Я пытаюсь написать свой собственный код, чтобы пройти по PATH, чтобы найти исполняемый файл в качестве учебного упражнения в программировании на Си. (после успеха я могу заменить его чужим кодом, но сейчас я хочу понять свои ошибки).

В следующем разделе кода не выполняется переход к другому выражению, которое я ожидаю ...

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define EXECUTABLE S_IXOTH /* executable by others */
#define MAX_PATH_LEN 1024

void message (const char *msg)
{
  fprintf(stdout, "INFO: %s\n", *msg);
}

int main (int argc, char *argv[], char *envp[])
{
  char *editor;
  struct stat editor_stat;
  char full_path[MAX_PATH_LEN];
  int found_path;

  memset(full_path,0,MAX_PATH_LEN);
  strcpy(full_path,"/bin/ed");
  found_path=stat(full_path,&editor_stat);

  if (found_path!=0) {
    editor=NULL;
    message("The EDITOR specified is not found in the PATH. Using default editor");
  } else {
    if (editor_stat.st_mode&EXECUTABLE==0) {
      editor=NULL;
      message("The EDITOR specified must have world execute permission. using default editoe");
    } else {
      editor=full_path;
    }
  }

}

Когда я отслеживаю его с помощью gdb, я вижу, что он переходит ко второму, а не к первому, и не выполняет проверку на исполняемый файл ...

(gdb) file /tmp/sample2
Reading symbols from /tmp/sample2...done.
(gdb) b 28
Breakpoint 1 at 0x400688: file /home/ken/c/shorter_sample.c, line 28.
(gdb) r
Starting program: /tmp/sample2 

Breakpoint 1, main (argc=1, argv=0x7fffffffe1f8, envp=0x7fffffffe208)
    at /home/ken/c/shorter_sample.c:28
28        if (found_path!=0) {
Missing separate debuginfos, use: debuginfo-install glibc-2.13-2.x86_64
(gdb) p found_path
$1 = 0
(gdb) s
36            editor=full_path;
(gdb) 

он должен перейти на строку 32, а не на 36.

Я попытался найти здесь неоднозначность C, и я прочитал разделы из "C" Kernighan & Ritchie, на которые есть ссылка в индексе под C неоднозначностью, и вставил в код столько фигурных скобок, сколько смогу, но компилятор не делает то, что я собираюсь.

Кстати, я использую gcc-4.5.1-4.fc14.x86_64 с ядром 2.6.35.14-106.fc14.x86_64 в Fedora 14.

1 Ответ

7 голосов
/ 07 января 2012

& имеет более низкий приоритет оператора, чем ==;это означает, что второе if выражение эквивалентно:

    if (editor_stat.st_mode&(EXECUTABLE==0))

Я собираюсь выйти на конечность и сказать, что EXECUTABLE не 0, что делает if эквивалентным:

    if (editor_stat.st_mode & 0)

или

    if (0)

Второе выражение if должно быть:

    if ((editor_stat.st_mode&EXECUTABLE)==0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...