PVS-ਸਟੂਡੀਓ ਐਨਾਲਾਈਜ਼ਰ ਦੀ ਵਰਤੋਂ ਕਰਕੇ rdesktop ਅਤੇ xrdp ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ

PVS-ਸਟੂਡੀਓ ਐਨਾਲਾਈਜ਼ਰ ਦੀ ਵਰਤੋਂ ਕਰਕੇ rdesktop ਅਤੇ xrdp ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ
RDP ਪ੍ਰੋਟੋਕੋਲ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ ਓਪਨ ਸੋਰਸ ਪ੍ਰੋਗਰਾਮਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਬਾਰੇ ਲੇਖਾਂ ਦੀ ਲੜੀ ਵਿੱਚ ਇਹ ਦੂਜੀ ਸਮੀਖਿਆ ਹੈ। ਇਸ ਵਿੱਚ ਅਸੀਂ rdesktop ਕਲਾਇੰਟ ਅਤੇ xrdp ਸਰਵਰ ਨੂੰ ਵੇਖਾਂਗੇ।

ਗਲਤੀਆਂ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ ਇੱਕ ਸਾਧਨ ਵਜੋਂ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਪੀਵੀਐਸ-ਸਟੂਡੀਓ. ਇਹ C, C++, C# ਅਤੇ ਜਾਵਾ ਭਾਸ਼ਾਵਾਂ ਲਈ ਇੱਕ ਸਥਿਰ ਕੋਡ ਵਿਸ਼ਲੇਸ਼ਕ ਹੈ, ਜੋ ਵਿੰਡੋਜ਼, ਲੀਨਕਸ ਅਤੇ ਮੈਕੋਸ ਪਲੇਟਫਾਰਮਾਂ 'ਤੇ ਉਪਲਬਧ ਹੈ।

ਲੇਖ ਸਿਰਫ ਉਹ ਗਲਤੀਆਂ ਪੇਸ਼ ਕਰਦਾ ਹੈ ਜੋ ਮੈਨੂੰ ਦਿਲਚਸਪ ਲੱਗਦੀਆਂ ਸਨ. ਹਾਲਾਂਕਿ, ਪ੍ਰੋਜੈਕਟ ਛੋਟੇ ਹਨ, ਇਸ ਲਈ ਕੁਝ ਗਲਤੀਆਂ ਸਨ :).

ਟਿੱਪਣੀ. FreeRDP ਪ੍ਰੋਜੈਕਟ ਤਸਦੀਕ ਬਾਰੇ ਇੱਕ ਪਿਛਲਾ ਲੇਖ ਪਾਇਆ ਜਾ ਸਕਦਾ ਹੈ ਇੱਥੇ.

rdesktop

rdesktop — UNIX-ਅਧਾਰਿਤ ਸਿਸਟਮਾਂ ਲਈ ਇੱਕ RDP ਕਲਾਇਟ ਦਾ ਮੁਫਤ ਲਾਗੂਕਰਨ। ਜੇਕਰ ਤੁਸੀਂ ਸਾਈਗਵਿਨ ਦੇ ਅਧੀਨ ਪ੍ਰੋਜੈਕਟ ਬਣਾਉਂਦੇ ਹੋ ਤਾਂ ਇਸਨੂੰ ਵਿੰਡੋਜ਼ ਦੇ ਅਧੀਨ ਵੀ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ। GPLv3 ਅਧੀਨ ਲਾਇਸੰਸਸ਼ੁਦਾ।

ਇਹ ਕਲਾਇੰਟ ਬਹੁਤ ਮਸ਼ਹੂਰ ਹੈ - ਇਹ ReactOS ਵਿੱਚ ਮੂਲ ਰੂਪ ਵਿੱਚ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਅਤੇ ਤੁਸੀਂ ਇਸਦੇ ਲਈ ਥਰਡ-ਪਾਰਟੀ ਗ੍ਰਾਫਿਕਲ ਫਰੰਟ-ਐਂਡ ਵੀ ਲੱਭ ਸਕਦੇ ਹੋ। ਹਾਲਾਂਕਿ, ਉਹ ਕਾਫ਼ੀ ਪੁਰਾਣਾ ਹੈ: ਉਸਦੀ ਪਹਿਲੀ ਰਿਲੀਜ਼ 4 ਅਪ੍ਰੈਲ, 2001 ਨੂੰ ਹੋਈ ਸੀ - ਲਿਖਣ ਦੇ ਸਮੇਂ, ਉਹ 17 ਸਾਲ ਦਾ ਹੈ।

ਜਿਵੇਂ ਕਿ ਮੈਂ ਪਹਿਲਾਂ ਨੋਟ ਕੀਤਾ ਹੈ, ਪ੍ਰੋਜੈਕਟ ਬਹੁਤ ਛੋਟਾ ਹੈ. ਇਸ ਵਿੱਚ ਕੋਡ ਦੀਆਂ ਲਗਭਗ 30 ਹਜ਼ਾਰ ਲਾਈਨਾਂ ਹਨ, ਜੋ ਕਿ ਇਸਦੀ ਉਮਰ ਨੂੰ ਦੇਖਦੇ ਹੋਏ ਥੋੜ੍ਹਾ ਅਜੀਬ ਹੈ। ਤੁਲਨਾ ਲਈ, FreeRDP ਵਿੱਚ 320 ਹਜ਼ਾਰ ਲਾਈਨਾਂ ਹਨ। ਇੱਥੇ ਕਲੌਕ ਪ੍ਰੋਗਰਾਮ ਦਾ ਆਉਟਪੁੱਟ ਹੈ:

PVS-ਸਟੂਡੀਓ ਐਨਾਲਾਈਜ਼ਰ ਦੀ ਵਰਤੋਂ ਕਰਕੇ rdesktop ਅਤੇ xrdp ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ

ਪਹੁੰਚਯੋਗ ਕੋਡ

V779 ਅਣਉਪਲਬਧ ਕੋਡ ਖੋਜਿਆ ਗਿਆ। ਇਹ ਸੰਭਵ ਹੈ ਕਿ ਕੋਈ ਗਲਤੀ ਮੌਜੂਦ ਹੈ। rdesktop.c 1502

int
main(int argc, char *argv[])
{
  ....
  return handle_disconnect_reason(deactivated, ext_disc_reason);

  if (g_redirect_username)
    xfree(g_redirect_username);

  xfree(g_username);
}

ਫੰਕਸ਼ਨ ਵਿੱਚ ਸਾਨੂੰ ਤੁਰੰਤ ਗਲਤੀ ਮਿਲਦੀ ਹੈ ਮੁੱਖ: ਅਸੀਂ ਆਪਰੇਟਰ ਦੇ ਬਾਅਦ ਕੋਡ ਨੂੰ ਦੇਖਦੇ ਹਾਂ ਵਾਪਸੀ — ਇਹ ਟੁਕੜਾ ਮੈਮੋਰੀ ਸਫਾਈ ਕਰਦਾ ਹੈ। ਹਾਲਾਂਕਿ, ਗਲਤੀ ਕੋਈ ਖਤਰਾ ਪੈਦਾ ਨਹੀਂ ਕਰਦੀ: ਪ੍ਰੋਗਰਾਮ ਦੇ ਬੰਦ ਹੋਣ ਤੋਂ ਬਾਅਦ ਸਾਰੀ ਨਿਰਧਾਰਤ ਮੈਮੋਰੀ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਦੁਆਰਾ ਕਲੀਅਰ ਕਰ ਦਿੱਤੀ ਜਾਵੇਗੀ।

ਕੋਈ ਗਲਤੀ ਹੈਂਡਲਿੰਗ ਨਹੀਂ

V557 ਐਰੇ ਅੰਡਰਰਨ ਸੰਭਵ ਹੈ। 'n' ਸੂਚਕਾਂਕ ਦਾ ਮੁੱਲ -1 ਤੱਕ ਪਹੁੰਚ ਸਕਦਾ ਹੈ। rdesktop.c 1872

RD_BOOL
subprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
{
  int n = 1;
  char output[256];
  ....
  while (n > 0)
  {
    n = read(fd[0], output, 255);
    output[n] = ' '; // <=
    str_handle_lines(output, &rest, linehandler, data);
  }
  ....
}

ਇਸ ਕੇਸ ਵਿੱਚ ਕੋਡ ਸਨਿੱਪਟ ਫਾਈਲ ਤੋਂ ਬਫਰ ਵਿੱਚ ਪੜ੍ਹਦਾ ਹੈ ਜਦੋਂ ਤੱਕ ਫਾਈਲ ਖਤਮ ਨਹੀਂ ਹੋ ਜਾਂਦੀ। ਹਾਲਾਂਕਿ, ਇੱਥੇ ਕੋਈ ਗਲਤੀ ਹੈਂਡਲਿੰਗ ਨਹੀਂ ਹੈ: ਜੇਕਰ ਕੁਝ ਗਲਤ ਹੋ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਨੂੰ ਪੜ੍ਹਨ -1 ਵਾਪਸ ਆ ਜਾਵੇਗਾ, ਅਤੇ ਫਿਰ ਐਰੇ ਓਵਰਰਨ ਹੋ ਜਾਵੇਗਾ ਆਉਟਪੁੱਟ.

ਚਾਰ ਕਿਸਮ ਵਿੱਚ EOF ਦੀ ਵਰਤੋਂ ਕਰਨਾ

V739 EOF ਦੀ ਤੁਲਨਾ 'char' ਕਿਸਮ ਦੇ ਮੁੱਲ ਨਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾਣੀ ਚਾਹੀਦੀ। '(c = fgetc(fp))' 'int' ਕਿਸਮ ਦਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ। ctrl.c 500


int
ctrl_send_command(const char *cmd, const char *arg)
{
  char result[CTRL_RESULT_SIZE], c, *escaped;
  ....
  while ((c = fgetc(fp)) != EOF && index < CTRL_RESULT_SIZE && c != 'n')
  {
    result[index] = c;
    index++;
  }
  ....
}

ਇੱਥੇ ਅਸੀਂ ਫਾਈਲ ਦੇ ਅੰਤ ਤੱਕ ਪਹੁੰਚਣ ਦੀ ਗਲਤ ਹੈਂਡਲਿੰਗ ਵੇਖਦੇ ਹਾਂ: if fgetc ਇੱਕ ਅੱਖਰ ਵਾਪਸ ਕਰਦਾ ਹੈ ਜਿਸਦਾ ਕੋਡ 0xFF ਹੈ, ਇਸ ਨੂੰ ਫਾਈਲ ਦੇ ਅੰਤ ਵਜੋਂ ਸਮਝਿਆ ਜਾਵੇਗਾ (EOF).

EOF ਇਹ ਇੱਕ ਸਥਿਰ ਹੈ, ਆਮ ਤੌਰ 'ਤੇ -1 ਵਜੋਂ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, CP1251 ਏਨਕੋਡਿੰਗ ਵਿੱਚ, ਰੂਸੀ ਵਰਣਮਾਲਾ ਦੇ ਆਖਰੀ ਅੱਖਰ ਵਿੱਚ ਕੋਡ 0xFF ਹੈ, ਜੋ ਨੰਬਰ -1 ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ ਜੇਕਰ ਅਸੀਂ ਇੱਕ ਵੇਰੀਏਬਲ ਬਾਰੇ ਗੱਲ ਕਰ ਰਹੇ ਹਾਂ ਜਿਵੇਂ ਕਿ char. ਇਹ ਪਤਾ ਚਲਦਾ ਹੈ ਕਿ ਪ੍ਰਤੀਕ 0xFF, ਜਿਵੇਂ EOF (-1) ਨੂੰ ਫਾਈਲ ਦੇ ਅੰਤ ਵਜੋਂ ਸਮਝਿਆ ਜਾਂਦਾ ਹੈ। ਅਜਿਹੀਆਂ ਗਲਤੀਆਂ ਤੋਂ ਬਚਣ ਲਈ, ਫੰਕਸ਼ਨ ਦਾ ਨਤੀਜਾ ਹੈ fgetc ਵਰਗੇ ਵੇਰੀਏਬਲ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ ਇੰਟ.

ਟਾਈਪੋਜ਼

ਖੰਡ 1

V547 ਸਮੀਕਰਨ 'ਲਿਖਣ_ਸਮਾਂ' ਹਮੇਸ਼ਾ ਗਲਤ ਹੁੰਦਾ ਹੈ। disk.c 805

RD_NTSTATUS
disk_set_information(....)
{
  time_t write_time, change_time, access_time, mod_time;
  ....
  if (write_time || change_time)
    mod_time = MIN(write_time, change_time);
  else
    mod_time = write_time ? write_time : change_time; // <=
  ....
}

ਸ਼ਾਇਦ ਇਸ ਕੋਡ ਦੇ ਲੇਖਕ ਨੂੰ ਇਹ ਗਲਤ ਲੱਗ ਗਿਆ ਹੈ || и && ਹਾਲਤ ਵਿੱਚ. ਆਓ ਮੁੱਲਾਂ ਲਈ ਸੰਭਵ ਵਿਕਲਪਾਂ 'ਤੇ ਵਿਚਾਰ ਕਰੀਏ ਲਿਖੋ_ਸਮਾਂ и ਤਬਦੀਲੀ_ਸਮਾਂ:

  • ਦੋਵੇਂ ਵੇਰੀਏਬਲ 0 ਦੇ ਬਰਾਬਰ ਹਨ: ਇਸ ਸਥਿਤੀ ਵਿੱਚ ਅਸੀਂ ਇੱਕ ਸ਼ਾਖਾ ਵਿੱਚ ਖਤਮ ਹੋਵਾਂਗੇ ਹੋਰ: ਵੇਰੀਏਬਲ mod_time ਅਗਲੀ ਸਥਿਤੀ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਹਮੇਸ਼ਾ 0 ਹੋਵੇਗਾ।
  • ਵੇਰੀਏਬਲਾਂ ਵਿੱਚੋਂ ਇੱਕ 0 ਹੈ: mod_time 0 ਦੇ ਬਰਾਬਰ ਹੋਵੇਗਾ (ਬਸ਼ਰਤੇ ਕਿ ਦੂਜੇ ਵੇਰੀਏਬਲ ਦਾ ਇੱਕ ਗੈਰ-ਨੈਗੇਟਿਵ ਮੁੱਲ ਹੋਵੇ), ਕਿਉਂਕਿ MIN ਦੋ ਵਿਕਲਪਾਂ ਵਿੱਚੋਂ ਛੋਟੇ ਨੂੰ ਚੁਣੇਗਾ।
  • ਦੋਵੇਂ ਵੇਰੀਏਬਲ 0 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹਨ: ਨਿਊਨਤਮ ਮੁੱਲ ਚੁਣੋ।

ਨਾਲ ਸ਼ਰਤ ਨੂੰ ਬਦਲਣ ਵੇਲੇ write_time && change_time ਵਿਹਾਰ ਸਹੀ ਦਿਖਾਈ ਦੇਵੇਗਾ:

  • ਇੱਕ ਜਾਂ ਦੋਵੇਂ ਵੇਰੀਏਬਲ 0 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹਨ: ਇੱਕ ਗੈਰ-ਜ਼ੀਰੋ ਮੁੱਲ ਚੁਣੋ।
  • ਦੋਵੇਂ ਵੇਰੀਏਬਲ 0 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹਨ: ਨਿਊਨਤਮ ਮੁੱਲ ਚੁਣੋ।

ਖੰਡ 2

V547 ਪ੍ਰਗਟਾਵਾ ਹਮੇਸ਼ਾ ਸੱਚ ਹੁੰਦਾ ਹੈ। ਸੰਭਵ ਤੌਰ 'ਤੇ ਇੱਥੇ '&&' ਆਪਰੇਟਰ ਵਰਤਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। disk.c 1419

static RD_NTSTATUS
disk_device_control(RD_NTHANDLE handle, uint32 request, STREAM in,
      STREAM out)
{
  ....
  if (((request >> 16) != 20) || ((request >> 16) != 9))
    return RD_STATUS_INVALID_PARAMETER;
  ....
}

ਜ਼ਾਹਰ ਹੈ ਕਿ ਓਪਰੇਟਰ ਇੱਥੇ ਵੀ ਰਲ ਗਏ ਹਨ || и &&, ਜਾਂ == и !=: ਇੱਕ ਵੇਰੀਏਬਲ ਵਿੱਚ ਇੱਕੋ ਸਮੇਂ 20 ਅਤੇ 9 ਦਾ ਮੁੱਲ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।

ਅਸੀਮਤ ਲਾਈਨ ਕਾਪੀ ਕਰਨਾ

V512 'sprintf' ਫੰਕਸ਼ਨ ਦੀ ਇੱਕ ਕਾਲ ਬਫਰ 'ਫੁੱਲਪਾਥ' ਦੇ ਓਵਰਫਲੋ ਵੱਲ ਲੈ ਜਾਵੇਗੀ। disk.c 1257

RD_NTSTATUS
disk_query_directory(....)
{
  ....
  char *dirname, fullpath[PATH_MAX];
  ....
  /* Get information for directory entry */
  sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);
  ....
}

ਜਦੋਂ ਤੁਸੀਂ ਫੰਕਸ਼ਨ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਦੇਖਦੇ ਹੋ, ਤਾਂ ਇਹ ਸਪੱਸ਼ਟ ਹੋ ਜਾਵੇਗਾ ਕਿ ਇਹ ਕੋਡ ਸਮੱਸਿਆ ਪੈਦਾ ਨਹੀਂ ਕਰਦਾ ਹੈ। ਹਾਲਾਂਕਿ, ਉਹ ਭਵਿੱਖ ਵਿੱਚ ਪੈਦਾ ਹੋ ਸਕਦੇ ਹਨ: ਇੱਕ ਲਾਪਰਵਾਹੀ ਤਬਦੀਲੀ ਅਤੇ ਅਸੀਂ ਇੱਕ ਬਫਰ ਓਵਰਫਲੋ ਪ੍ਰਾਪਤ ਕਰਾਂਗੇ - ਸਪ੍ਰਿੰਟ ਕਿਸੇ ਵੀ ਚੀਜ਼ ਦੁਆਰਾ ਸੀਮਿਤ ਨਹੀਂ ਹੈ, ਇਸਲਈ ਜਦੋਂ ਮਾਰਗਾਂ ਨੂੰ ਜੋੜਦੇ ਹਾਂ ਤਾਂ ਅਸੀਂ ਐਰੇ ਦੀਆਂ ਸੀਮਾਵਾਂ ਤੋਂ ਬਾਹਰ ਜਾ ਸਕਦੇ ਹਾਂ। ਇਸ ਕਾਲ 'ਤੇ ਨੋਟਿਸ ਕਰਨ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ snprintf(fullpath, PATH_MAX, ....).

ਬੇਲੋੜੀ ਹਾਲਤ

V560 ਕੰਡੀਸ਼ਨਲ ਸਮੀਕਰਨ ਦਾ ਇੱਕ ਹਿੱਸਾ ਹਮੇਸ਼ਾ ਸਹੀ ਹੁੰਦਾ ਹੈ: ਜੋੜੋ > 0. scard.c 507

static void
inRepos(STREAM in, unsigned int read)
{
  SERVER_DWORD add = 4 - read % 4;
  if (add < 4 && add > 0)
  {
    ....
  }
}

ਨਿਰੀਖਣ > 0 ਜੋੜੋ ਇੱਥੇ ਕੋਈ ਲੋੜ ਨਹੀਂ ਹੈ: ਵੇਰੀਏਬਲ ਹਮੇਸ਼ਾ ਜ਼ੀਰੋ ਤੋਂ ਵੱਡਾ ਹੋਵੇਗਾ, ਕਿਉਂਕਿ ਪੜ੍ਹੋ % 4 ਭਾਗ ਦਾ ਬਾਕੀ ਹਿੱਸਾ ਵਾਪਸ ਕਰੇਗਾ, ਪਰ ਇਹ ਕਦੇ ਵੀ 4 ਦੇ ਬਰਾਬਰ ਨਹੀਂ ਹੋਵੇਗਾ।

xrdp

xrdp - ਓਪਨ ਸੋਰਸ ਕੋਡ ਦੇ ਨਾਲ ਇੱਕ RDP ਸਰਵਰ ਨੂੰ ਲਾਗੂ ਕਰਨਾ। ਪ੍ਰੋਜੈਕਟ ਨੂੰ 2 ਭਾਗਾਂ ਵਿੱਚ ਵੰਡਿਆ ਗਿਆ ਹੈ:

  • xrdp - ਪ੍ਰੋਟੋਕੋਲ ਲਾਗੂ ਕਰਨਾ। ਅਪਾਚੇ 2.0 ਲਾਇਸੰਸ ਦੇ ਤਹਿਤ ਵੰਡਿਆ ਗਿਆ।
  • xorgxrdp - xrdp ਨਾਲ ਵਰਤਣ ਲਈ Xorg ਡਰਾਈਵਰਾਂ ਦਾ ਸੈੱਟ। ਲਾਇਸੰਸ - X11 (ਜਿਵੇਂ ਕਿ MIT, ਪਰ ਇਸ਼ਤਿਹਾਰਬਾਜ਼ੀ ਵਿੱਚ ਵਰਤੋਂ ਦੀ ਮਨਾਹੀ ਹੈ)

ਪ੍ਰੋਜੈਕਟ ਦਾ ਵਿਕਾਸ rdesktop ਅਤੇ FreeRDP ਦੇ ਨਤੀਜਿਆਂ 'ਤੇ ਅਧਾਰਤ ਹੈ। ਸ਼ੁਰੂ ਵਿੱਚ, ਗ੍ਰਾਫਿਕਸ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਇੱਕ ਵੱਖਰਾ VNC ਸਰਵਰ, ਜਾਂ RDP ਸਹਾਇਤਾ - X11rdp ਦੇ ਨਾਲ ਇੱਕ ਵਿਸ਼ੇਸ਼ X11 ਸਰਵਰ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਪੈਂਦੀ ਸੀ, ਪਰ xorgxrdp ਦੇ ਆਗਮਨ ਦੇ ਨਾਲ, ਉਹਨਾਂ ਦੀ ਲੋੜ ਗਾਇਬ ਹੋ ਗਈ।

ਇਸ ਲੇਖ ਵਿੱਚ ਅਸੀਂ xorgxrdp ਨੂੰ ਕਵਰ ਨਹੀਂ ਕਰਾਂਗੇ।

xrdp ਪ੍ਰੋਜੈਕਟ, ਪਿਛਲੇ ਇੱਕ ਦੀ ਤਰ੍ਹਾਂ, ਬਹੁਤ ਛੋਟਾ ਹੈ ਅਤੇ ਇਸ ਵਿੱਚ ਲਗਭਗ 80 ਹਜ਼ਾਰ ਲਾਈਨਾਂ ਹਨ।

PVS-ਸਟੂਡੀਓ ਐਨਾਲਾਈਜ਼ਰ ਦੀ ਵਰਤੋਂ ਕਰਕੇ rdesktop ਅਤੇ xrdp ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ

ਹੋਰ ਟਾਈਪੋਜ਼

V525 ਕੋਡ ਵਿੱਚ ਸਮਾਨ ਬਲਾਕਾਂ ਦਾ ਸੰਗ੍ਰਹਿ ਸ਼ਾਮਲ ਹੈ। ਲਾਈਨਾਂ 87, 88, 89 ਵਿੱਚ ਆਈਟਮਾਂ 'r', 'g', 'r' ਦੀ ਜਾਂਚ ਕਰੋ। rfxencode_rgb_to_yuv.c 87

static int
rfx_encode_format_rgb(const char *rgb_data, int width, int height,
                      int stride_bytes, int pixel_format,
                      uint8 *r_buf, uint8 *g_buf, uint8 *b_buf)
{
  ....
  switch (pixel_format)
  {
    case RFX_FORMAT_BGRA:
      ....
      while (x < 64)
      {
          *lr_buf++ = r;
          *lg_buf++ = g;
          *lb_buf++ = r; // <=
          x++;
      }
      ....
  }
  ....
}

ਇਹ ਕੋਡ librfxcodec ਲਾਇਬ੍ਰੇਰੀ ਤੋਂ ਲਿਆ ਗਿਆ ਸੀ, ਜੋ RemoteFX ਲਈ jpeg2000 ਕੋਡੇਕ ਨੂੰ ਲਾਗੂ ਕਰਦਾ ਹੈ। ਇੱਥੇ, ਜ਼ਾਹਰ ਤੌਰ 'ਤੇ, ਗ੍ਰਾਫਿਕ ਡੇਟਾ ਚੈਨਲਾਂ ਨੂੰ ਮਿਲਾਇਆ ਜਾਂਦਾ ਹੈ - "ਨੀਲੇ" ਰੰਗ ਦੀ ਬਜਾਏ, "ਲਾਲ" ਦਰਜ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਹ ਗਲਤੀ ਸੰਭਾਵਤ ਤੌਰ 'ਤੇ ਕਾਪੀ-ਪੇਸਟ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਪ੍ਰਗਟ ਹੋਈ ਹੈ।

ਇੱਕ ਸਮਾਨ ਫੰਕਸ਼ਨ ਵਿੱਚ ਵੀ ਇਹੀ ਸਮੱਸਿਆ ਆਈ ਹੈ rfx_encode_format_argb, ਜਿਸਨੂੰ ਵਿਸ਼ਲੇਸ਼ਕ ਨੇ ਸਾਨੂੰ ਇਹ ਵੀ ਦੱਸਿਆ ਹੈ:

V525 ਕੋਡ ਵਿੱਚ ਸਮਾਨ ਬਲਾਕਾਂ ਦਾ ਸੰਗ੍ਰਹਿ ਸ਼ਾਮਲ ਹੈ। ਲਾਈਨਾਂ 260, 261, 262, 263 ਵਿੱਚ ਆਈਟਮਾਂ 'a', 'r', 'g', 'r' ਦੀ ਜਾਂਚ ਕਰੋ। rfxencode_rgb_to_yuv.c 260

while (x < 64)
{
    *la_buf++ = a;
    *lr_buf++ = r;
    *lg_buf++ = g;
    *lb_buf++ = r;
    x++;
}

ਐਰੇ ਘੋਸ਼ਣਾ

V557 ਐਰੇ ਓਵਰਰਨ ਸੰਭਵ ਹੈ। 'i — 8' ਸੂਚਕਾਂਕ ਦਾ ਮੁੱਲ 129 ਤੱਕ ਪਹੁੰਚ ਸਕਦਾ ਹੈ। genkeymap.c 142

// evdev-map.c
int xfree86_to_evdev[137-8+1] = {
  ....
};

// genkeymap.c
extern int xfree86_to_evdev[137-8];

int main(int argc, char **argv)
{
  ....
  for (i = 8; i <= 137; i++) /* Keycodes */
  {
    if (is_evdev)
        e.keycode = xfree86_to_evdev[i-8];
    ....
  }
  ....
}

ਇਹਨਾਂ ਦੋ ਫਾਈਲਾਂ ਵਿੱਚ ਐਰੇ ਦੀ ਘੋਸ਼ਣਾ ਅਤੇ ਪਰਿਭਾਸ਼ਾ ਅਸੰਗਤ ਹੈ - ਆਕਾਰ 1 ਦੁਆਰਾ ਵੱਖਰਾ ਹੈ। ਹਾਲਾਂਕਿ, ਕੋਈ ਗਲਤੀ ਨਹੀਂ ਹੁੰਦੀ ਹੈ - evdev-map.c ਫਾਈਲ ਵਿੱਚ ਸਹੀ ਆਕਾਰ ਨਿਰਧਾਰਤ ਕੀਤਾ ਗਿਆ ਹੈ, ਇਸਲਈ ਕੋਈ ਹੱਦ ਤੋਂ ਬਾਹਰ ਨਹੀਂ ਹੈ। ਇਸ ਲਈ ਇਹ ਸਿਰਫ਼ ਇੱਕ ਬੱਗ ਹੈ ਜਿਸ ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਠੀਕ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।

ਗਲਤ ਤੁਲਨਾ

V560 ਕੰਡੀਸ਼ਨਲ ਸਮੀਕਰਨ ਦਾ ਇੱਕ ਹਿੱਸਾ ਹਮੇਸ਼ਾ ਗਲਤ ਹੁੰਦਾ ਹੈ: (ਕੈਪ_ਲੇਨ <0)। xrdp_caps.c 616

// common/parse.h
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define in_uint16_le(s, v) do 
....
#else
#define in_uint16_le(s, v) do 
{ 
    (v) = *((unsigned short*)((s)->p)); 
    (s)->p += 2; 
} while (0)
#endif

int
xrdp_caps_process_confirm_active(struct xrdp_rdp *self, struct stream *s)
{
  int cap_len;
  ....
  in_uint16_le(s, cap_len);
  ....
  if ((cap_len < 0) || (cap_len > 1024 * 1024))
  {
    ....
  }
  ....
}

ਫੰਕਸ਼ਨ ਇੱਕ ਕਿਸਮ ਵੇਰੀਏਬਲ ਪੜ੍ਹਦਾ ਹੈ ਘੱਟ ਦਸਤਖਤ ਕੀਤੇ ਵਰਗੇ ਇੱਕ ਵੇਰੀਏਬਲ ਵਿੱਚ ਇੰਟ. ਇੱਥੇ ਜਾਂਚ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਅਸੀਂ ਇੱਕ ਅਸਾਈਨ ਕੀਤੇ ਵੇਰੀਏਬਲ ਨੂੰ ਪੜ੍ਹ ਰਹੇ ਹਾਂ ਅਤੇ ਨਤੀਜੇ ਨੂੰ ਇੱਕ ਵੱਡੇ ਵੇਰੀਏਬਲ ਨੂੰ ਸੌਂਪ ਰਹੇ ਹਾਂ, ਇਸਲਈ ਵੇਰੀਏਬਲ ਇੱਕ ਨੈਗੇਟਿਵ ਮੁੱਲ ਨਹੀਂ ਲੈ ਸਕਦਾ ਹੈ।

ਬੇਲੋੜੀ ਜਾਂਚ

V560 ਸ਼ਰਤੀਆ ਸਮੀਕਰਨ ਦਾ ਇੱਕ ਹਿੱਸਾ ਹਮੇਸ਼ਾ ਸੱਚ ਹੁੰਦਾ ਹੈ: (bpp!= 16). libxrdp.c 704

int EXPORT_CC
libxrdp_send_pointer(struct xrdp_session *session, int cache_idx,
                     char *data, char *mask, int x, int y, int bpp)
{
  ....
  if ((bpp == 15) && (bpp != 16) && (bpp != 24) && (bpp != 32))
  {
      g_writeln("libxrdp_send_pointer: error");
      return 1;
  }
  ....
}

ਅਸਮਾਨਤਾ ਜਾਂਚਾਂ ਦਾ ਇੱਥੇ ਕੋਈ ਮਤਲਬ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਸਾਡੇ ਕੋਲ ਸ਼ੁਰੂਆਤ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਤੁਲਨਾ ਹੈ। ਇਹ ਸੰਭਾਵਨਾ ਹੈ ਕਿ ਇਹ ਇੱਕ ਟਾਈਪੋ ਹੈ ਅਤੇ ਡਿਵੈਲਪਰ ਆਪਰੇਟਰ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਚਾਹੁੰਦਾ ਸੀ || ਅਵੈਧ ਆਰਗੂਮੈਂਟਾਂ ਨੂੰ ਫਿਲਟਰ ਕਰਨ ਲਈ।

ਸਿੱਟਾ

ਆਡਿਟ ਦੌਰਾਨ, ਕੋਈ ਗੰਭੀਰ ਤਰੁੱਟੀਆਂ ਦੀ ਪਛਾਣ ਨਹੀਂ ਕੀਤੀ ਗਈ, ਪਰ ਬਹੁਤ ਸਾਰੀਆਂ ਕਮੀਆਂ ਪਾਈਆਂ ਗਈਆਂ। ਹਾਲਾਂਕਿ, ਇਹ ਡਿਜ਼ਾਈਨ ਬਹੁਤ ਸਾਰੇ ਸਿਸਟਮਾਂ ਵਿੱਚ ਵਰਤੇ ਜਾਂਦੇ ਹਨ, ਭਾਵੇਂ ਦਾਇਰਾ ਵਿੱਚ ਛੋਟਾ ਹੁੰਦਾ ਹੈ। ਇੱਕ ਛੋਟੇ ਪ੍ਰੋਜੈਕਟ ਵਿੱਚ ਜ਼ਰੂਰੀ ਤੌਰ 'ਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਗਲਤੀਆਂ ਨਹੀਂ ਹੁੰਦੀਆਂ, ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਸਿਰਫ ਛੋਟੇ ਪ੍ਰੋਜੈਕਟਾਂ 'ਤੇ ਵਿਸ਼ਲੇਸ਼ਕ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਦਾ ਨਿਰਣਾ ਨਹੀਂ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ। ਤੁਸੀਂ ਇਸ ਬਾਰੇ ਲੇਖ ਵਿੱਚ ਹੋਰ ਪੜ੍ਹ ਸਕਦੇ ਹੋ "ਸੰਖਿਆਵਾਂ ਦੁਆਰਾ ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ ਭਾਵਨਾਵਾਂ".

ਤੁਸੀਂ ਸਾਡੇ ਤੋਂ PVS-ਸਟੂਡੀਓ ਦਾ ਟ੍ਰਾਇਲ ਵਰਜਨ ਡਾਊਨਲੋਡ ਕਰ ਸਕਦੇ ਹੋ ਸਾਈਟ.

PVS-ਸਟੂਡੀਓ ਐਨਾਲਾਈਜ਼ਰ ਦੀ ਵਰਤੋਂ ਕਰਕੇ rdesktop ਅਤੇ xrdp ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ

ਜੇਕਰ ਤੁਸੀਂ ਇਸ ਲੇਖ ਨੂੰ ਅੰਗਰੇਜ਼ੀ ਬੋਲਣ ਵਾਲੇ ਦਰਸ਼ਕਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਅਨੁਵਾਦ ਲਿੰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ: ਸਰਗੇਈ ਲਾਰਿਨ। PVS-ਸਟੂਡੀਓ ਨਾਲ rdesktop ਅਤੇ xrdp ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ

ਸਰੋਤ: www.habr.com

ਇੱਕ ਟਿੱਪਣੀ ਜੋੜੋ