이것은 이전의 Valgrind 질문보다 중점을 두었습니다.잘못된 쓰기 오류를보고하는 Valgrind
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/utsname.h>
#include <sys/stat.h>
#include <string.h>
#include <locale.h>
#include <bzlib.h>
#include <zlib.h>
#include "starch.h"
#define BUFMAXLEN 1024
int main(int argc, char **argv) {
if (parseCommandLineInputs(&argc, &argv) != 0)
exit(EXIT_FAILURE);
return 0;
}
int parseCommandLineInputs(int *argc, char ***argv) {
pid_t pid;
struct utsname uts;
char uniqTag[BUFMAXLEN];
if ((*argc == 1) || (*argc > 4)) {
printUsage();
return -1;
}
if ((pid = getpid()) < 0) {
fprintf(stderr, "\n\t[starch] - Error: Could not obtain process ID\n\n");
return -1;
}
uname(&uts);
sprintf(uniqTag, "pid%d.%s", pid, uts.nodename);
switch (*argc) {
case 2: {
if (strcmp(*argv[1], "-") != 0) {
if (fileExists(*argv[1]) != 0) { /* standard input */
...
}
return 0;
}
int fileExists(char *fn) {
struct stat buf;
int i = stat (fn, &buf);
if (i == 0)
return 0;
return -1;
}
void printUsage() {
fprintf(stderr, "my usage statement\n\n");
}
내 메이크 파일은 다음과 같다 : 나는 명령 줄 옵션 구문 분석 할 때 쓰기를 좁혀 오류를 읽으려고하고
CC = gcc
CFLAGS = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -DUSE_ZLIB -O3 -Wformat -Wall -pedantic -std=gnu99 -g
BIN = ../bin
all: starch
rm -rf *~
starch: starch.o
mkdir -p $(BIN) && $(CC) ${CFLAGS} starch.o -lbz2 -lz -o ${BIN}/starch
rm -rf *~
clean:
rm -rf *.o *~ ${BIN}/starch
을 내가 valgrind
실행할 때 다음과 같은 오류를 얻을 :
$ valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes -v ../bin/starch
...
==2675== 1 errors in context 1 of 2:
==2675== Invalid read of size 8
==2675== at 0x3AB4262243: fwrite (in /lib64/libc-2.5.so)
==2675== Address 0x7fedffd68 is on thread 1's stack
==2675==
==2675==
==2675== 1 errors in context 2 of 2:
==2675== Invalid write of size 8
==2675== at 0x401AA6: parseCommandLineInputs (starch.c:217)
==2675== by 0x7FF0000AF: ???
==2675== by 0x401DFA: main (starch.c:46)
==2675== Address 0x7fedffd68 is on thread 1's stack
어디서나 fwrite()
을 사용하지 않으므로 처음 사용할 때 아무 것도 알려주지 못합니다.
fprintf
문에서 printUsage()
의 두 번째 오류가 발생합니다.
fprintf(stderr, "my usage statement\n\n");
이러한 오류가 표시되는 이유를 설명 내 응용 프로그램에 어떤 문제가 :
if (parseCommandLineInputs(&argc, &argv) != 0)
라인 (217)이 다음 줄은 다음과 같습니다
선 (46)는 다음 줄입니까?
이 전체 프로그램 (NO'#의 include's,'uts','uniqTag', 또는'pid'에 대한 어떤 정의가) 없습니다. 'parseCommandLineInputs'의 행이 뒤 공백으로 가득 찬 이유는 무엇입니까? – pmg
정보의 절반만으로 어떻게 프로그램을 디버깅 할 수있을 것으로 기대하십니까? uts, uniqTag는 어디에 있습니까? starch.c의 46과 217 행은 무엇입니까? --db-attach = yes를 사용해 보셨습니까? – BatchyX