ดังนั้นฉันจึงได้รับข้อความที่ไม่ได้กำหนดค่าเริ่มต้นจาก valgrind และมันค่อนข้างลึกลับซึ่งเป็นที่มาของค่าที่ไม่ดี
ดูเหมือนว่า valgrind แสดงให้เห็นถึงสถานที่ที่มีการใช้ค่า unitialised แต่ไม่ใช่ที่มาของค่าเริ่มต้น
==11366== Conditional jump or move depends on uninitialised value(s)
==11366== at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E31B4: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42EE56F: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
==11366== by 0x810B9F1: Snake::Snake::update() (snake.cpp:257)
==11366== by 0x81113C1: SnakeApp::updateState() (snakeapp.cpp:224)
==11366== by 0x8120351: RoenGL::updateState() (roengl.cpp:1180)
==11366== by 0x81E87D9: Roensachs::update() (rs.cpp:321)
จะเห็นได้ว่ามันเป็นความลับ .. โดยเฉพาะอย่างยิ่งเพราะเมื่อพูดโดย Class :: MethodX บางครั้งมันชี้ตรงไปที่ ostream เป็นต้นบางทีนี่อาจเป็นเพราะการเพิ่มประสิทธิภาพหรือไม่
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
เป็นแบบนั้น. มีบางอย่างที่ฉันขาดหายไปหรือไม่? เป็นวิธีที่ดีที่สุดในการจับค่าที่ไม่ดีโดยไม่ต้องหันไปหางานนักสืบ printf ยาวเป็นพิเศษคืออะไร?
ปรับปรุง:
ฉันพบว่ามีอะไรผิดปกติ แต่สิ่งที่แปลกคือ valgrind ไม่ได้รายงานเมื่อมีการใช้ค่าที่ไม่ดีเป็นครั้งแรก มันถูกใช้ในฟังก์ชั่นการคูณ:
movespeed = stat.speedfactor * speedfac * currentbendfactor.val;
ที่ไหน speedfac เป็นหน่วยลอย อย่างไรก็ตามในเวลานั้นยังไม่ได้รายงานและไม่ได้จนกว่าจะพิมพ์ค่าที่ฉันได้รับข้อผิดพลาด .. มีการตั้งค่าสำหรับ valgrind เพื่อเปลี่ยนพฤติกรรมนี้หรือไม่?