Tôi gặp phải một vấn đề rất lạ ngày hôm nay. Câu chuyện dài ngắn, hàm của tôi trả về một giá trị, người gọi nhận được một giá trị khác. Một nơi nào đó xung quanh mã của tôi Tôi có một cuộc gọi đến:Giá trị thay đổi hàm C khi trả lại. Ngăn xếp bị hỏng?
Message* m = NULL;
m = connection_receive(c);
đâu connection_receive được định nghĩa như sau:
Message* connection_receive(Connection* c)
{
Message* k;
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
k = NULL;
else
k = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
/* Until here, k is reachable and contains the correct data. */
return k;
}
else
return NULL;
}
Dưới đây là một hoạt động gdb, tôi dừng lại ngay trước khi sự trở lại và ngay sau khi chuyển nhượng:
222 return k;
(gdb) p k
$1 = (Message *) 0x7ffff0000950
(gdb) n
226 }
(gdb) n
main() at src/main.c:57
57 if (m)
(gdb) p m
$2 = (Message *) 0xfffffffff0000950
Tất nhiên, nếu chúng tôi cố gắng truy cập 0xfffffffff0000950, chúng tôi sẽ nhận được lỗi phân đoạn.
Nếu tôi thay đổi hàm và thay vì trả về một giá trị, sử dụng thông số thứ hai để chuyển giá trị hoạt động, nhưng tôi muốn biết điều gì đã xảy ra trên giá trị này.
Cảm ơn bạn rất nhiều.
EDIT: Tính năng này hoạt động nhưng không thuận tiện. Và tôi cũng muốn biết tại sao lỗi lạ như vậy lại xảy ra.
void connection_receive2(Connection* c, Message** m)
{
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
*m = NULL;
else
*m = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
}
else
*m = NULL;
}
EDIT2: Giải quyết. Cảm ơn tất cả. Sự cố là lỗi đánh máy trên tệp tiêu đề. Tôi không thể sử dụng -Werror vì tôi cần phải làm những việc mà tăng một số cảnh báo và trong một đầu ra lớn và tiêu đề lớn, tôi đã bỏ qua nó.
Tôi đã xảy ra điều đó một lần. 'fin' cho thấy một giá trị trả về và biến nó được lưu trữ vào một giá trị khác. Một biên dịch đã sửa nó cho tôi (thậm chí không thay đổi nguồn gốc); tốt nhất tôi có thể đoán là một tập tin đối tượng phụ thuộc đã không nhận được biên dịch lại, nếu không có thể là một lỗi (hiếm khi gặp phải) trong gcc. – Kevin
Bạn cần phải đun sôi điều này xuống [SSCCE] (http://sscce.org/) để minh họa sự cố và đăng nó - không có gì sai với mã bạn đã đăng; vấn đề nằm ở nơi khác. –
@BrianRoach, tôi sẽ xem những gì tôi có thể làm. Đó là một dự án lớn. – Victor