PVS-ಸ್ಟುಡಿಯೋ ವಿಶ್ಲೇಷಕವನ್ನು ಬಳಸಿಕೊಂಡು rdesktop ಮತ್ತು xrdp ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ

PVS-ಸ್ಟುಡಿಯೋ ವಿಶ್ಲೇಷಕವನ್ನು ಬಳಸಿಕೊಂಡು rdesktop ಮತ್ತು xrdp ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ
ಆರ್‌ಡಿಪಿ ಪ್ರೋಟೋಕಾಲ್‌ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಓಪನ್ ಸೋರ್ಸ್ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಪರೀಕ್ಷಿಸುವ ಕುರಿತು ಲೇಖನಗಳ ಸರಣಿಯಲ್ಲಿ ಇದು ಎರಡನೇ ವಿಮರ್ಶೆಯಾಗಿದೆ. ಅದರಲ್ಲಿ ನಾವು rdesktop ಕ್ಲೈಂಟ್ ಮತ್ತು xrdp ಸರ್ವರ್ ಅನ್ನು ನೋಡುತ್ತೇವೆ.

ದೋಷಗಳನ್ನು ಗುರುತಿಸುವ ಸಾಧನವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ ಪಿವಿಎಸ್-ಸ್ಟುಡಿಯೋ. ಇದು C, C++, C# ಮತ್ತು Java ಭಾಷೆಗಳಿಗೆ ಸ್ಥಿರ ಕೋಡ್ ವಿಶ್ಲೇಷಕವಾಗಿದೆ, ಇದು Windows, Linux ಮತ್ತು macOS ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ಗಳಲ್ಲಿ ಲಭ್ಯವಿದೆ.

ಲೇಖನವು ನನಗೆ ಆಸಕ್ತಿದಾಯಕವೆಂದು ತೋರುವ ದೋಷಗಳನ್ನು ಮಾತ್ರ ಪ್ರಸ್ತುತಪಡಿಸುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಯೋಜನೆಗಳು ಚಿಕ್ಕದಾಗಿದೆ, ಆದ್ದರಿಂದ ಕೆಲವು ತಪ್ಪುಗಳಿವೆ :).

ಹೇಳಿಕೆಯನ್ನು. FreeRDP ಯೋಜನೆಯ ಪರಿಶೀಲನೆಯ ಕುರಿತು ಹಿಂದಿನ ಲೇಖನವನ್ನು ಕಾಣಬಹುದು ಇಲ್ಲಿ.

ಆರ್ಡೆಸ್ಕ್ಟಾಪ್

ಆರ್ಡೆಸ್ಕ್ಟಾಪ್ - 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 ಅನ್ನು 'ಚಾರ್' ಪ್ರಕಾರದ ಮೌಲ್ಯದೊಂದಿಗೆ ಹೋಲಿಸಬಾರದು. '(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 ಆಗಿರುವ ಅಕ್ಷರವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ, ಅದನ್ನು ಫೈಲ್‌ನ ಅಂತ್ಯ ಎಂದು ಅರ್ಥೈಸಲಾಗುತ್ತದೆ (ಇಒಎಫ್).

ಇಒಎಫ್ ಇದು ಸ್ಥಿರವಾಗಿರುತ್ತದೆ, ಸಾಮಾನ್ಯವಾಗಿ -1 ಎಂದು ವ್ಯಾಖ್ಯಾನಿಸಲಾಗುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, CP1251 ಎನ್‌ಕೋಡಿಂಗ್‌ನಲ್ಲಿ, ರಷ್ಯಾದ ವರ್ಣಮಾಲೆಯ ಕೊನೆಯ ಅಕ್ಷರವು 0xFF ಕೋಡ್ ಅನ್ನು ಹೊಂದಿದೆ, ಇದು ನಾವು ವೇರಿಯಬಲ್ ಬಗ್ಗೆ ಮಾತನಾಡುತ್ತಿದ್ದರೆ ಸಂಖ್ಯೆ -1 ಗೆ ಅನುರೂಪವಾಗಿದೆ ಚಾರ್. ಚಿಹ್ನೆ 0xFF, ಹಾಗೆ ಎಂದು ಅದು ತಿರುಗುತ್ತದೆ ಇಒಎಫ್ (-1) ಅನ್ನು ಫೈಲ್‌ನ ಅಂತ್ಯ ಎಂದು ಅರ್ಥೈಸಲಾಗುತ್ತದೆ. ಅಂತಹ ದೋಷಗಳನ್ನು ತಪ್ಪಿಸಲು, ಕಾರ್ಯದ ಫಲಿತಾಂಶವಾಗಿದೆ fgetc ನಂತಹ ವೇರಿಯೇಬಲ್‌ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಬೇಕು ಇಂಟ್.

ಮುದ್ರಣದೋಷಗಳು

ತುಣುಕು 1

V547 'write_time' ಎಂಬ ಅಭಿವ್ಯಕ್ತಿ ಯಾವಾಗಲೂ ತಪ್ಪಾಗಿರುತ್ತದೆ. 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 ಗೆ ಸಮನಾಗಿರುವುದಿಲ್ಲ: ಕನಿಷ್ಠ ಮೌಲ್ಯವನ್ನು ಆರಿಸಿ.

ಸ್ಥಿತಿಯನ್ನು ಬದಲಾಯಿಸುವಾಗ ಬರೆಯುವ_ಸಮಯ && ಸಮಯ_ಬದಲಾವಣೆ ನಡವಳಿಕೆಯು ಸರಿಯಾಗಿ ಕಾಣುತ್ತದೆ:

  • ಒಂದು ಅಥವಾ ಎರಡೂ ವೇರಿಯೇಬಲ್‌ಗಳು 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(ಫುಲ್‌ಪಾತ್, 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 - ಪ್ರೋಟೋಕಾಲ್ ಅನುಷ್ಠಾನ. Apache 2.0 ಪರವಾನಗಿ ಅಡಿಯಲ್ಲಿ ವಿತರಿಸಲಾಗಿದೆ.
  • xorgxrdp - xrdp ನೊಂದಿಗೆ ಬಳಸಲು Xorg ಡ್ರೈವರ್‌ಗಳ ಒಂದು ಸೆಟ್. ಪರವಾನಗಿ - X11 (ಎಂಐಟಿಯಂತೆ, ಆದರೆ ಜಾಹೀರಾತಿನಲ್ಲಿ ಬಳಸುವುದನ್ನು ನಿಷೇಧಿಸುತ್ತದೆ)

ಯೋಜನೆಯ ಅಭಿವೃದ್ಧಿಯು rdesktop ಮತ್ತು FreeRDP ಫಲಿತಾಂಶಗಳನ್ನು ಆಧರಿಸಿದೆ. ಆರಂಭದಲ್ಲಿ, ಗ್ರಾಫಿಕ್ಸ್‌ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು, ನೀವು ಪ್ರತ್ಯೇಕ VNC ಸರ್ವರ್ ಅಥವಾ RDP ಬೆಂಬಲದೊಂದಿಗೆ ವಿಶೇಷ X11 ಸರ್ವರ್ ಅನ್ನು ಬಳಸಬೇಕಾಗಿತ್ತು - X11rdp, ಆದರೆ 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 ಷರತ್ತುಬದ್ಧ ಅಭಿವ್ಯಕ್ತಿಯ ಭಾಗವು ಯಾವಾಗಲೂ ತಪ್ಪಾಗಿರುತ್ತದೆ: (cap_len <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-Studio ನ ಪ್ರಾಯೋಗಿಕ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದು ಸೈಟ್.

PVS-ಸ್ಟುಡಿಯೋ ವಿಶ್ಲೇಷಕವನ್ನು ಬಳಸಿಕೊಂಡು rdesktop ಮತ್ತು xrdp ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ

ನೀವು ಈ ಲೇಖನವನ್ನು ಇಂಗ್ಲಿಷ್ ಮಾತನಾಡುವ ಪ್ರೇಕ್ಷಕರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸಿದರೆ, ದಯವಿಟ್ಟು ಅನುವಾದ ಲಿಂಕ್ ಅನ್ನು ಬಳಸಿ: ಸೆರ್ಗೆ ಲಾರಿನ್. PVS-Studio ನೊಂದಿಗೆ rdesktop ಮತ್ತು xrdp ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ