Что не так с этим крошечным кусочком мьютекса? - PullRequest
2 голосов
/ 20 ноября 2008
// A Mutex allows threads mutually exclusive access to a resource.
//-----------------------------------------------------------------------

class Mutex
{
private:
    CRITICAL_SECTION m_mutex;

public:
     Mutex() { InitializeCriticalSection(&m_mutex); }
    ~Mutex() { DeleteCriticalSection(&m_mutex);     }

    void acquire() { EnterCriticalSection(&m_mutex); }
    void release() { LeaveCriticalSection(&m_mutex); }
};

Используя программное обеспечение Entrek Codesnitch для отладки и проверки на любые утечки памяти и т. Д., Он сообщает об ошибке:

InitializeCriticalSection Error: lpCriticalSection (0x000387d4) points to an invalid 
  memory location (0x00018984) Mutex::Mutex in lockmutex.h, line 29

Может быть, все мои бессонные ночи наконец-то дошли до меня. Но я не понимаю, на что именно жалуются. Есть идеи?

Ответы [ 3 ]

6 голосов
/ 20 ноября 2008

CodeSnitch, по-видимому, недостаточно умен, чтобы знать, что InitializeCriticalSection () ожидает, что будет работать над структурой, содержащей неинициализированный указатель.

Подумайте об этом с точки зрения CodeSnitch. В чем разница между тем, что вы делаете, и этим:

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

class CheckoutLine {
  private:
    Customer m_customer;
  public CheckoutLine() {
    greetCustomer(&m_customer);
  }
};

Это выглядит более подозрительно для человеческого глаза, потому что мы делаем вывод, что greetCustomer, вероятно, будет полагаться на инициализацию m_customer, чего, очевидно, нет. Но семантически это точно так же, как ваш код.

Вероятно, стоит подать ошибку с Entrek; InitializeCriticalSection () является разумным исключением из правила «структуры должны быть инициализированы перед передачей их в функцию».

4 голосов
/ 20 ноября 2008

Держу пари, что вы можете подделать стукач с помощью :: memset (& m_mutex, 0, sizeof (m_mutex)); перед вызовом, чтобы инициировать его.

0 голосов
/ 20 ноября 2008

Я не вижу ничего плохого в вашем классе определение . Где это используется, хотя? Конкретный экземпляр все еще может быть использован неправильно.

Определение Win32 CRITICAL_SECTION включает указатель на «struct _RTL_CRITICAL_SECTION *». ОС могла бы быть умной в обработке этой структуры таким образом, чтобы запутать инструмент.

...