es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo errores C26xxx en mi código de servicio de Windows en C++.

Estoy obteniendo errores en mi código. El código se compila, pero me gustaría deshacerme de las advertencias. He buscado en stackoverflow y google y he hecho clic en las advertencias las cuales me llevan a la página microsoft.com, donde se explica cada una de ellas, pero no veo ejemplos concretos de cómo deshacerme de ellas.

Aquí está el código en C++ y las advertencias.

void WINAPI ServiceMain(DWORD dwArgc, LPWSTR* lpszArgv);

VOID main() noexcept
{
CONST SERVICE_TABLE_ENTRY ste[] = { {L"MiServicio", ServiceMain}, {NULL, NULL} };

// C26485 Expresión 'ste': No hay decaimiento de array a puntero (bounds.3).
StartServiceCtrlDispatcherW(ste);
}

// C26429 El símbolo 'lpszArgv' nunca se prueba para nulidad, se puede marcar como not_null (f.23).
// C26461 El argumento de puntero 'lpszArgv' para la función 'ServiceMain' se puede marcar como puntero a constante (con.3).
VOID WINAPI ServiceMain(DWORD dwArgc, LPWSTR* lpszArgv)
{

// C26481 No utilice aritmética de punteros. Utilice en su lugar 'span' (bounds.1).
ssh = RegisterServiceCtrlHandlerExW(lpszArgv[0], (LPHANDLER_FUNCTION_EX) Service_Ctrl, 0);
...

}

Cualquier ayuda es apreciada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sugerencias para abordar las advertencias en el código de C++

    Has mencionado que estás viendo advertencias en tu código después de la compilación y estás buscando formas de deshacerte de ellas. Aquí tienes algunas sugerencias para abordar las advertencias específicas que has compartido:

    • C26485 – Expresión ‘ste’: No hay decaimiento de array a puntero (bounds.3).

      Esta advertencia indica que hay un array que se está pasando a una función como un puntero sin haberse decaído. Para abordar esta advertencia, puedes modificar la llamada a la función para pasar el tamaño del array explícitamente. Por ejemplo:

      StartServiceCtrlDispatcherW(&ste[0]);
      

      Esto debería eliminar la advertencia y asegurarse de que el array adecuado se pase a la función.

    • C26429 – El símbolo ‘lpszArgv’ nunca se comprueba si es nulo, se puede marcar como not_null (f.23).

      Esta advertencia indica que el puntero al argumento ‘lpszArgv’ no se comprueba si es nulo antes de ser utilizado. Para abordar esta advertencia, puedes agregar una comprobación de nulidad antes de usar el puntero, de la siguiente manera:

      if (lpszArgv != nullptr) {
      // utilizar el puntero de forma segura
      }
      

    • C26461 – El argumento puntero ‘lpszArgv’ de la función ‘ServiceMain’ se puede marcar como un puntero a constante (con.3).

      Esta advertencia indica que el argumento puntero de la función ‘ServiceMain’ se puede marcar como un puntero a constante. Para abordar esta advertencia, puedes modificar la firma de la función para incluir la palabra clave const, de la siguiente manera:

      VOID WINAPI ServiceMain(DWORD dwArgc, LPCWSTR const* lpszArgv) 
      

      Esto debería eliminar la advertencia y asegurarse de que el puntero no se modifique en la función.

    • C26481 – No utilices aritmética de punteros. Utiliza span en su lugar (bounds.1).

      Esta advertencia indica que se está utilizando aritmética de punteros en el código y sugiere utilizar el tipo de dato ‘span’ en su lugar. Para abordar esta advertencia, puedes incluir el encabezado ‘span’ y modificar la línea de código de la siguiente manera:

      ssh = RegisterServiceCtrlHandlerExW(lpszArgv[0], (LPHANDLER_FUNCTION_EX) Service_Ctrl, std::span<lphandler_function_ex>{});
      

      Esto debería eliminar la advertencia y garantizar que el código sea seguro y eficiente.

    Al abordar estas advertencias, puedes asegurarte de que tu código sea seguro, eficiente y esté libre de cualquier advertencia emitida por el compilador.

Comments are closed.