2015-01-08 12 views
12

tôi đang học ngôn ngữ C từ Learn C The Hard Way. Tôi đang ở trên exercise 6 và trong khi tôi có thể làm cho nó hoạt động, valgrind repots rất nhiều lỗi.Valgrind báo cáo lỗi cho một chương trình C rất đơn giản

Đây là tước xuống chương trình tối thiểu từ một tập tin ex6.c:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char initial = 'A'; 
    float power = 2.345f; 

    printf("Character is %c.\n", initial); 
    printf("You have %f levels of power.\n", power); 

    return 0; 
} 

Nội dung Makefile chỉ CFLAGS=-Wall -g là.

Tôi biên dịch chương trình với $ make ex6 (không có cảnh báo hoặc lỗi trình biên dịch). Việc thực thi với $ ./ex6 sẽ tạo ra kết quả mong đợi.

Khi tôi chạy chương trình với $ valgrind ./ex6 Tôi gặp lỗi mà tôi không thể giải quyết được. Đây là đầu ra đầy đủ:

==69691== Memcheck, a memory error detector 
==69691== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==69691== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info 
==69691== Command: ./ex6 
==69691== 
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option 
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) 
--69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) 
==69691== Conditional jump or move depends on uninitialised value(s) 
==69691== at 0x1003FBC3F: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) 
==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x100000F1B: main (ex6.c:8) 
==69691== 
Character is A. 
==69691== Invalid read of size 32 
==69691== at 0x1003FBC1D: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) 
==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) 
==69691== by 0x100000F31: main (ex6.c:9) 
==69691== Address 0x100809680 is 32 bytes before a block of size 32 in arena "client" 
==69691== 
You have 2.345000 levels of power. 
==69691== 
==69691== HEAP SUMMARY: 
==69691==  in use at exit: 39,365 bytes in 429 blocks 
==69691== total heap usage: 510 allocs, 81 frees, 45,509 bytes allocated 
==69691== 
==69691== LEAK SUMMARY: 
==69691== definitely lost: 16 bytes in 1 blocks 
==69691== indirectly lost: 0 bytes in 0 blocks 
==69691==  possibly lost: 13,090 bytes in 117 blocks 
==69691== still reachable: 26,259 bytes in 311 blocks 
==69691==   suppressed: 0 bytes in 0 blocks 
==69691== Rerun with --leak-check=full to see details of leaked memory 
==69691== 
==69691== For counts of detected and suppressed errors, rerun with: -v 
==69691== Use --track-origins=yes to see where uninitialised values come from 
==69691== ERROR SUMMARY: 5 errors from 2 contexts (suppressed: 0 from 0) 

Tôi đang ở trên OS X yosemite. Valgrind được cài đặt thông qua brew với lệnh này $ brew install valgrind --HEAD.

Vì vậy, có ai biết vấn đề ở đây là gì không? Làm cách nào để khắc phục lỗi valgrind?

+0

Bạn đang liên kết với một số thư viện bên ngoài? –

+2

Trên Linux của tôi, ví dụ của bạn không báo cáo bất kỳ lỗi nào. Trong thanh bên Liên kết có liên quan, có [một gợi ý sử dụng tệp nén] (http://stackoverflow.com/questions/5226691/valgrind-mac-os-mem-leak?rq=1). –

+0

@IngoLeonhardt: Các đối số biến thể của loại 'float' được thăng thành' double', do đó không phải là vấn đề. (Và nguyên mẫu chính xác là trong ' ', được bao gồm.) –

Trả lời

12

Nếu chương trình bạn đang chạy qua Valgrind chính xác là chương trình bạn đăng trong câu hỏi của bạn, rõ ràng là không có bất kỳ rò rỉ bộ nhớ nào. Trong thực tế, bạn thậm chí không sử dụng malloc/tự mình!

Dường như với tôi như thế này là các lỗi giả/dương tính giả mà Valgrind phát hiện trên OS X (chỉ!), Tương tự như what happened to myself some time ago.

Nếu bạn có quyền truy cập vào một hệ điều hành khác nhau, ví dụ một máy Linux, hãy thử phân tích chương trình bằng cách sử dụng Valgrind trên hệ thống đó.

EDIT: tôi đã không cố gắng này bản thân mình, vì tôi không có quyền truy cập vào một máy Mac ngay bây giờ, nhưng bạn nên thử những gì M OEHM gợi ý: try to use a supressions file as mentioned in this other SO question.

+0

Tôi không thể tìm thấy tệp nén cho OS X Yosemite. Câu trả lời SA không có bất kỳ ảnh hưởng nào đến đầu ra Valgrind. Mặt khác, thực hiện các bước tương tự trong âm thanh với linux tạo ra một đầu ra Valgrind sạch. –

+0

Tôi đã xác nhận điều này trên máy của riêng mình. Tôi đã sao chép chương trình đơn giản này trên Mac OS X, chạy với Valgrind và có một bước nhảy có điều kiện. – brandaemon

1

Đánh giá từ this chủ đề, tôi cho rằng valgrind không được đảm bảo để cung cấp kết quả chính xác trên nền tảng của bạn. Nếu bạn có thể, hãy thử mã này trên một nền tảng khác.

Thủ phạm hoặc là trong việc điều chỉnh chính nó hoặc trong việc triển khai hệ thống của bạn là printf, cả hai điều này sẽ không thực tế để bạn khắc phục.

Rerun with --leak-check=full to see details of leaked memory. Điều này sẽ cung cấp cho bạn một số thông tin khác về sự rò rỉ bạn đang gặp phải. Nếu không có gì hữu ích, bạn có thể tạo suppression file để ngăn không cho hiển thị lỗi.

+0

Rất tiếc, hiện tại bạn không thể tạo tệp đàn áp cho "Đọc không hợp lệ kích thước 32". Có lỗi mới này trong cảng Darwin, nhưng chưa hỗ trợ cho việc chặn các lỗi có kích thước lớn hơn 16. Nên là vấn đề thời gian để thực hiện điều này (có vẻ như là một sửa lỗi nhỏ). – antirez

10

Sự cố này được khắc phục cho Darwin 14.3.0 (Mac OS X 10.10.2) sử dụng Valgrind r14960 with VEX r3124 cho Xcode6.2 và Valgrind r15088 cho Xcode 6.3.

Nếu bạn đang sử dụng Macports (tại thời điểm viết bài này), sudo port install valgrind-devel sẽ cung cấp cho bạn Valgrind r14960 with VEX r3093.

Dưới đây là xây dựng kịch bản của tôi để cài đặt Valgrind r14960 with VEX r3124:

#! /usr/bin/env bash 

mkdir -p buildvalgrind 
cd buildvalgrind 
svn co svn://svn.valgrind.org/valgrind/trunk/@14960 valgrind 
cd valgrind 
./autogen.sh 
./configure --prefix=/usr/local 
make && sudo make install 

# check that we have our valgrind installed 
/usr/local/bin/valgrind --version 

(tham khảo: http://calvinx.com/2015/04/10/valgrind-on-mac-os-x-10-10-yosemite/)

My valgrind macports cài đặt tọa lạc tại /opt/local/bin/valgrind.

Nếu bây giờ tôi chạy

/opt/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

tôi sẽ nhận được chính xác các lỗi tương tự như bạn mô tả ở trên. (Sử dụng tập tin objc.supp của tôi ở đây https://gist.github.com/calvinchengx/0b1d45f67be9fdca205b)

Nhưng nếu tôi chạy

/usr/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

Mọi thứ hoạt động như mong đợi và tôi không nhận được lỗi bộ nhớ cấp hệ thống bị rò rỉ cho thấy lên.

Các vấn đề liên quan