Reperiens rdesktop et xrdp utens PVS-Studio analyser

Reprehendo rdesktop et xrdp utens PVS Studio analyser
Haec est altera recensio in serie articulorum de probationibus apertis principiorum programmatum operandi cum RDP protocollo. In ea rdesktop clientem et xrdp ministrum spectabimus.

Usus est instrumentum ad errores identify PVS Studio,. Codicis static est analysris pro C, C++, C# et linguarum Javae, quae in Fenestra, Linux et macOS suggesta sunt.

Articulus illos solos errores exhibet qui mihi interesting videbantur. Sed incepta sunt parva, sic errata:).

illud. Praecedens articulus de FreeRDP project verificationis potest inveniri hic.

rdesktop

rdesktop - libera exsecutio clientis RDP pro systematibus UNIX-fundatis. Etiam sub Fenestra adhiberi potest si consilium sub Cygwin aedificaveris. Licentiatus sub GPLv3.

Cliens hic valde popularis est - defalta in ReactOS adhibetur, et tertiam partem graphice ante-finis pro eo invenire potes. Tamen est admodum senex: prima dimissio facta est die 4 mensis Aprilis anno 2001 - tempore scripto, ipse est 17 annorum.

Ut supra dictum est, consilium est admodum parvum. Continet codicem circiter 30 milia linearum, quae paulum aliena pro sua aetate. Ad comparationem, FreeRDP CCCXX milia linearum continet. Hic progressio Cloc output est:

Reprehendo rdesktop et xrdp utens PVS Studio analyser

impossibile codice

V779 In promptu codice deprehenditur. Fieri potest ut error sit praesens. 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);
}

Error incidit statim in functione summa: Videmus codicem venire post operator reditum — Hoc fragmentum purgatio memoriam praestat. Sed error non ponit comminationem: omnis memoria partita ab operativa ratio post curriculi exitus patebit.

Nullus error pertractatio

V557 Ordinare underrun fieri potest. Valor 'n' index pervenire potuit -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);
  }
  ....
}

Praecisum codicem in hoc casu legit e tabella in quiddam usque ad finem tabellae. Sed nullus error hic tractat: si quid erratum est, tunc read redibit -1, et erit impleta ordinata output.

Using EOF in char type

V739 EOF non conferri debent cum valore generis char. The ' (c = fgetc(fp))' should be of the 'int' type. 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++;
  }
  ....
}

Hic falsam tractationem de fine tabellae attingendi videmus: if fgetc reddit characterem, cuius signum 0xFF est, in fine tabella interpretabitur (EOF,).

EOF, constans, fer^-1. Verbi gratia, in CP1251 descriptam, ultima littera alphabeti Russici habet codicem 0xFF, qui respondet numero -1 si loquimur de variabili simili. char. Evenit ut signum 0xFF EOF, (-1) interpretatur tabella finis. Ad huiusmodi errores vitandos, effectus functionis est fgetc debet condi variabilis sicut int.

Typos

Fragment 1

V547 Expressio 'write_time' semper falsa est. 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; // <=
  ....
}

Fortasse auctor codicis huius iniuriae obtinuit || и && in conditione. Consideremus possibilia optiones pro values write_time и change_time:

  • Ambae variabiles pares sunt 0: hoc casu in ramo finiemus aliud: variabilis mod_time Semper erit 0 cujuscumque conditionis sequentis.
  • Una variabilium est 0: mod_time erit = 0 (dummodo alia variabilis valorem non negativum habeat), quia MIN minorem eliget duos bene.
  • Ambae variabiles pares non sunt 0: valorem minimum elige.

Cum repositoque conditione cum write_time && change_time mores rectos spectant;

  • Una vel utraque variabilis aequalis non est 0: valorem non-nullam elige.
  • Ambae variabiles pares non sunt 0: valorem minimum elige.

Fragment 2

V547 Vera locutio semper est. Probabiliter "&&" hic uti debet. 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;
  ....
}

Operatores videntur etiam hic misceri || и &&uel == и !=: Variabilis valorem 20 et 9 simul habere non potest.

Infinita linea exscribend

V512 Vocatio 'sprintf' munus ducet ad redundantiam quiddam 'pleni'. 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);
  ....
}

Cum munus in plena spectes, patebit hunc codicem difficultates non causare. Sed in futurum oriantur: incautae mutationis quiddam et redundantiam dabimus - sprintf* non limitatur ab aliquo, ut cum concatenatis viis extra limites ordinatae possumus. Commendatur ut animadverto hanc vocationem on snprintf(plenitudo, PATH_MAX, ....).

Superuacua conditio

V560 Pars expressionis conditionalis semper vera est: add > 0. scard.c 507

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

inspectis adde > 0 hic opus non est: variabilis semper major nulla erit, quia legere % 4 residuum autem divi- dium redibit, sed nunquam 4 aequale erit.

xrdp

xrdp - exsecutionem servo RDP cum fonte aperto codice. Consilium in partes 2 divisum est;

  • xrdp - protocollum deducendum. Distributa sub Apache 2.0 licentia.
  • xorgxrdp — A rectoribus pro xorg xt ex Xorg pro usu cum xrdp. Licentia - X11 (sicut MIT, sed vetat uti in vendo)

Explicatio consilii fundatur in eventibus rdesktop et FreeRDP. Initio, in graphice laborandum, uti debebas servo separato VNC, vel speciali ministro X11 cum RDP auxilio - X11rdp, sed adveniente xorgxrdp, necessitas evanuit.

In hoc articulo xorgxrdp non operiemus.

Proiectum xrdp, sicut praecedens, valde parvum est et circiter 80 milia linearum continet.

Reprehendo rdesktop et xrdp utens PVS Studio analyser

More typos

V525 Codex collectionem similium caudices continet. Perscriptio items 'r', 'g', 'r' in lines 87, 88, 89. 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++;
      }
      ....
  }
  ....
}

Ex hoc codice desumptus est e bibliothecae librfxcodec, quae codicem jpeg2000 pro RemoteFX conficit. Hic, ut videtur, canales notae graphicae commiscentur - pro colore "hyacinthini", "ruber" commemoratur. Hic error verisimillimum apparuit e crustulum exemplarium.

Eadem quaestio in simili functione occurrit rfx_encode_format_argbquod analystor etiam indicavit;

V525 Codex collectionem similium caudices continet. Perscriptio item 'a', 'r', 'g', 'r' in lines 260, 261, 262, 263. rfxencode_rgb_to_yuv.c 260

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

Ordinare Declaratio

V557 Forum vexata est possibile. Valor 'i — 8' perveniat index 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];
    ....
  }
  ....
}

Declaratio et definitio ordinata in his duobus scriniis repugnant - magnitudo differt ab 1. Nihilominus errores non occurrunt - magnitudo recta specificatur in lima evdev-map.c, ideo non est extra limites. Hoc ergo iustum est cimex quod facile figi potest.

Comparatio recta

V560 Pars expressionis conditionalis semper falsa est: (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))
  {
    ....
  }
  ....
}

Munus legit genus variabilis unsigned brevis in variabilis sicut int. Perscriptio hic non opus est, quia legentes sine notabili variabili et eventum maiori variabili assignantes, ergo variabilis valorem negativum accipere non potest.

necesse checks

V560 Pars expressionis conditionalis semper vera est: (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;
  }
  ....
}

Inequalitas cohibet non sensum hic, cum iam in principio habeamus comparationem. Verisimile est hoc typo et elit uti operator || ut irritum rationes ex filter.

conclusio,

In computo non graves errores inveniuntur, sed multi defectus inventi sunt. Sed haec consilia in multis systematibus, etsi parva in causa, adhibentur. Parva propositio multos errores necessario non habet, ideo non debes iudicare analysris opus solum in parvis inceptis. Plura de hoc legere potes in articulo "Affectus confirmati numeris".

Potes experiri versionem PVS-Studii de nobis website.

Reprehendo rdesktop et xrdp utens PVS Studio analyser

Si articulum hunc cum auditorio Anglico loquentem communicare vis, nexus translationis uti: Sergey Larin. Reprehendo rdesktop et xrdp cum PVS-Studio

Source: www.habr.com

Add a comment