Minecraft mods, lang Katalan, ak interaksyon ki pa evidan ak operatè a ternè - ki jan anpil bagay analizè nou an te jwenn! Se poutèt sa, li se tan an pou yo pataje pwen yo ak ou. Rechèch sou 10 pi gwo erè Java ke PVS-Studio analizè detekte nan pwojè sous louvri nan 2025. Introduction nan ane sa a, nou te tcheke anpil pwojè sous louvri ak ekri sou yo. Articles nan Koulye a, nou te chwazi dè santèn nan bug yo ki pi enteresan ak fragman kòd bizarre. Seleksyon an ak rankings yo, nan kou, subjektif ak ki baze sou sans la pwòp nou an nan coolness. Ak atik sa a se jis koleksyon an nan konklizyon sa yo. Li nan tan - nou pral ale! 10yèm plas. Dwa nan lwès, lwès nan dwat Nou louvri tèt nou an ak yon ka soti nan Nan yon fason, pwojè a rezone ak nou: tankou PVS-Studio, li analize lang - sèlman natirèl yo, pa artificiel. Lingvistik Yon bagay enteresan se ke erè sa a ki gen rapò ak analizè nou an. Sepandan, nou jwenn li konsa amizman ke nou jis pa ka pase li. Reyèlman, ki jan nouvo ane ta dwe san yo pa yon ti kras mal? Tcheke fragman nan kòd la: public String getEnclitic(AnalyzedToken token) { .... if (word.endsWith("ه")) { suffix = "ه"; .... else if ((word.equals("عني") || word.equals("مني")) && word.endsWith("ني") // <= ) { suffix = "ني"; } .... } PvS-Study a avèti nan: Ekspresyon an 'word.endsWith("ni")' se toujou fals. V6007 nan ArabikTagger.java 428 Si nou tcheke konstan string nan fason natif natal la nan lang LTR - tankou angle oswa franse - anjeneral fè, alèz la nan analizè a sanble dwa. Sepandan, gen yon nuans enpòtan: Arabi se yon lang Dwa-lwès (RTL), ak sa vle di ke kote - Arabi moun ki pale espere final la nan yon literal, yo pral reyèlman wè kòmansman li yo. Bè, kòm li te fini, analizè nou an Konvèti nan Arabic. non can't Byèman, si nou konnen ke gen yon RTL ekri, nou konprann ke kondisyon an se reyèlman toujou Pa gen fake. true Li te fè nou enteresan: ki jan Java ap travay ak lang ki nan dwat-a-lwès nan tout? Tout bagay se senp kòm yon pie: Java ap travay ak Unicode olye pou vizyalizasyon tèks la. Nan Unicode, karaktè soti nan nenpòt lang - si yo ekri soti nan lwès-a-dwa oswa dwat-a-lwès - , sa vle di, nan lòd ki nan ki moun ki pale natif natal li ak ekri yo. yo anbake nan lòd logik Sa vle di Java pa bezwen fè nenpòt konvèsyon espesyal pou travay ak tèks RTL. String la rete yon seri regilye nan pwen kòd Unicode, ak operasyon tankou jwenn longè li, aksè karakter, oswa ekstrè yon substring travay menm pou tout lang. Se konsa, pou yon tcheke sa a: System.out.println("مرحباً بالجميع".endsWith("بالجميع")); Rezilta a pral , sepandan si nou li soti nan bò solèy la nan bò dwat, ranje a kòmanse, olye de fini, ak "بالجميع". true Epitou, paske analizè a teknikman erè isit la, nou mete li nan 10yèm plas nan ranking nou an. Si ou se enteresan yo aprann plis, ou ka li istwa a konplè sou ki jan nou analize LanguageTool nan sa a . Règleman 9yèm plas. lang Katalan ap parèt nan ranje nou an ankò! Lingvistik Modil nan lang Katalan gen metòd, ki neteman korekte fòm ortografik oblije ak retire diakriti ki pa nesesè. Pou egzanp, li konvèti "adéu" nan "adieu", "dóna" nan "dona", "vénen" nan "venen" ak sou sa: removeOldDiacritics() private String removeOldDiacritics(String s) { return s .replace("contrapèl", "contrapel") .replace("Contrapèl", "Contrapel") .replace("vés", "ves") .replace("féu", "feu") .replace("desféu", "desfeu") .replace("adéu", "adeu") .replace("dóna", "dona") .replace("dónes", "dones") .replace("sóc", "soc") .replace("vénen", "venen") .replace("véns", "véns") // <= .replace("fóra", "fora") .replace("Vés", "Ves") .replace("Féu", "Feu") .replace("Desféu", "Desfeu") .replace("Adéu", "Adeu") .replace("Dóna", "Dona") .replace("Dónes", "Dones") .replace("Sóc", "Soc") .replace("Vénen", "Venen") .replace("Véns", "Vens") .replace("Fóra", "Fora"); } Nan premye gade, li sanble ok: li travay, koreksyon, ak pa enkyete nenpòt moun. Analizè a gen yon lòt pwen: Fonkksyon an 'ranplase' resevwa yon argòm enteresan. Argòm la '" véns " te pase plizyè fwa. V6009 nan Katalan.Java nan 453 Pifò chans, lè devlopè yo te travay ak blòk sa a, yo jis kopi motè orijinal la ak ranplase letri a, men nan ka sa a, te oblije chanje letre a nan argiman an dezyèm: .... .replace("véns", "vens") .... Kòm analizè nou an pou lang artificiel te kapab detekte yon erè nan analizè yo pou lang natirèl, sa a alantou genyen plas nan lis la tèt nou an. 8yèm plas. Efè final liy Let's go further, now we talk about the error from . Elasticsearch Tcheke fragman nan kòd la: @Override public boolean equals(Object obj) { .... KeyedFilter other = (KeyedFilter) obj; return Objects.equals(keys, other.keys) && Objects.equals(timestamp, other.timestamp) && Objects.equals(tiebreaker, other.tiebreaker) && Objects.equals(child(), other.child()) && isMissingEventFilter == isMissingEventFilter; // <= } PVS-Studio avèti: V6001 Gen egzanp sous-expressions 'isMissingEventFilter' nan bò a ak bò a nan operatè a '=='. KlavyeFilter.java 116 Kòm nan egzanp la anvan, nou ap fè fas ak yon tiyo, men ak yon ti nuans: erè a rive nan dènye liy blòk nan kòd menm jan an. Situa sa a ap vini byen souvan pandan devlopman, konsa souvan ke devlopè yo te bay li yon non, Menm nan pwojè sa a, sa a se pa yon sèl ka: yon erè menm jan an parèt nan ranje a dènye nan yon lòt blòk nan kòd la menm: the last line effect @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; IndexError that = (IndexError) o; return indexName.equals(that.indexName) && Arrays.equals(shardIds, that.shardIds) && errorType == that.errorType && message.equals(that.message) && stallTimeSeconds == stallTimeSeconds; // <= } PVS-Studio avèti: V6001 Gen egzanp sous-expressions 'stallTimeSeconds' nan bò solèy ak bò dwat nan operatè a '=='. IndexError.java nan 147 Si ou vle aprann plis sou efè sa a, nou envite ou li atik sa yo: premye reyinyon nou ak li: The Last Line Efè; a more detailed discussion about the phenomenon: . The last line effect explained Kòm erè sa a demontre yon fenomèn konsa enteresan, nou bay li yon plas nan lis la tèt nou an. 7. Lose nan lokalizasyon Pase nan pozisyon an sètyèm. Nou te deja tcheke nan twa erè Java, men nou pa te jwenn Minecraft ankò. Li nan tan yo ranpli sa a! Jwenn yon gade nan kòd la soti nan : CustomNPC+ nan private String getTimePast() { .... if(selected.timePast > 3600000){ int hours = (int) (selected.timePast / 3600000); if(hours == 1) return hours + " " + StatCollector.translateToLocal("mailbox.hour"); else return hours + " " + StatCollector.translateToLocal("mailbox.hours"); } int minutes = (int) (selected.timePast / 60000); if(minutes == 1) return minutes + " " + StatCollector.translateToLocal("mailbox.minutes"); else return minutes + " " + StatCollector.translateToLocal("mailbox.minutes"); } PvS-Study a avèti nan: Deklarasyon an "tan" se ekivalan ak Deklarasyon an "else". V6004 nan GuiMailbox.java nan 76 Isit la nou ka wè yon tiyo ki mennen nan yon erè lokalizasyon. Depann sou kantite minit, tou de "minit" oswa "minit" ta dwe parèt. Sepandan, nan kondisyon final la, kòd la nan ak branch se idantite, ki toujou pwodui "minit". then else Kòm otè a nan sa a li di, "Pòke resous a tèks pou se deja nan kay yo nan jwèt la, voye komisyon an te pran plis tan pase fikse kòd la." Pou fikse li, devlopè yo ta dwe retire yon letrin. Lè sa a, fòm la mot la kòrèk pral parèt nan tout lang ki sipòte pa mod la. Règleman mailbox.minute Natirèlman, erè a se pa tèlman grav, men paske li ka reprodike san yo pa gen okenn pwoblèm, li genyen plas sètyèm nan tèt nou an: nan 6yèm plas. Sa a te dènye pwa a Pase nan erè a nan : machin nan public static final int MAX_TYPE_NUMBER = 20; private static final LongAdder[] USAGE_STATS = new LongAdder[MAX_TYPE_NUMBER]; .... public static ByteBuf byteBuffer(int initCapacity, int type) { try { if (MEMORY_USAGE_DETECT) { .... if (type > MAX_TYPE_NUMBER) { counter = UNKNOWN_USAGE_STATS; } else { counter = USAGE_STATS[type]; // <= .... } .... } .... } } PvS-Study a avèti nan: . Possibly index 'type' is out of bounds. V6025 ByteBufAlloc.java 156 Sa a se yon erè byen komen (onètman, konsa komen ke otè a nan lis sa a tèt li te fè li trè souvan). Akòz yon erè ti kras nan kondisyon an, yon ka rive sou liy la kòd ki montre pa analizè a. MAX_TYPE_NUMBER OutOfBoundsException Li ka rive paske nan Li pèmèt yon situasyon kote, nan Branch, nan paramèt yo pral gen , ki depase maksimòm valab endèks matris pa yon sèl. Nan ka sa a, yon eksepsyon deyò-de-limit yo pral mete, depi liy an premye aksè matris la lè l sèvi avèk index. if (type > MAX_TYPE_NUMBER) else type MAX_TYPE_NUMBER type Pou retire li, nou sèlman bezwen sèvi ak Pandan ke . >= > Kòm erè sa a se tou pre nan kè a nan otè a, li genyen plas la sisyèm nan lis la nan tèt la. 5th plas. Done ekstèn nan HTML Koulye a, li 's turn. Look at the code: Pwodwi public class HelloSessionServlet extends HttpServlet { .... @Override protected void doGet( HttpServletRequest request, HttpServletResponse response ) { .... String greeting = request.getParameter("greeting"); // <= if (greeting != null) { .... message = "New greeting '" + greeting + "' set in session."; // <= .... } .... PrintWriter out = response.getWriter(); out.println("<h1>" + greeting + " from HelloSessionServlet</h1>"); // <= out.println("<p>" + message + "</p>"); // <= .... } } PvS-Study a avèti nan: Possible XSS injection. Potansyèlman kontwole done nan 'message' varyab la ka itilize pou egzekite yon script malware. Pwodwi pou Telefòn HelloSessionServlet.java 70 nan Analizè a montre ke gen posib yon . XSS enjekte Nan kòd la, nou jwenn yon strè soti nan demann an, sèvi ak li yo kreye mesaj, ak Lè sa a, sèvi ak mesaj sa yo yo yo yo kreye yon paj HTML. Paske done demann la se pa nan nenpòt fason, enjections XSS se reyèlman posib. sanitize Si ekstèn la pase se JavaScript nan will be executed when the page is opened. Just like any other js code. message <script>alert("XSS Injection")</script> alert("XSS Injection") Si sa a se yon kwasans reyèl, poukisa li pa rankontre pi wo nan lis la? Paske li se yon pati nan yon egzanp demografik. Nan lòt men, nou montre kòd la jis yo wè sa ki ka rive nan Jetty. Sepandan, li vo remake ke egzanp la demografik pa ka kopye nan pwodiksyon an. Anplis de sa, li se pa pratik ki pi bon yo montre kòd ki pa an sekirite. As the first -analysis warning in a real project, although it's in a demonstration example, we award it 5th place in the top. Tanp 4yèm plas. Double sèlman Jwenn yon gade nan erè nan . Elasticsearch public static Number truncate(Number n, Number precision) { .... Double result = (((n.doubleValue() < 0) ? Math.ceil(g) : Math.floor(g)) / tenAtScale); return n instanceof Float ? result.floatValue() : result; // <= } PvS-Study a avèti nan: Rezilta a nan ekspresyon sa a pral implicitman mete nan 'double'. Tcheke si pwogram logik ap travay ak li byen. Pwodwi pou Pwodwi pou Telefòn Metòd sa a koupe nimewo a pase dapre presizyon an espesifye. Pou valè enteryè, li diminye kantite nimewo yo, pandan y ap pou valè fraksyonèl, li retire nimewo a plis apre pwen decimal la. Fragman an pi wo a montre logik la ki te aplike nan nimewo fraksyonèl. Judging by the ternary operator, in the case of fractions, developers want the method to return an identical number with which it came to the method (either ou ). Men, yon detay subtile men enpòtan te ignoré. Float Double Operatè a ternè se yon ekspresyon, ki vle di rezilta li ta dwe gen yon sèl ak predetermined kalite. Nan moman sa a, règ yo nan vini nan jwèt la. Kòm yon rezilta, sa a aplike: Konteks nimewo Si objè nan kalite diferan parèt nan yon ekspresyon, yo konvèti nan yon sèl kalite komen. Nan ka sa a, kalite a komen ta dwe Double, paske li reprezante tou de Double ak Float. That is, despite expectations, the method always returns a lè processe nimewo fraksyonèl. Double Yon fòma anrejistreman kompak reyèlman kite nou desann. Yon koreksyon ka sanble tankou sa a: public static Number truncate(Number n, Number precision) { .... if (n instanceof Float) { return result.floatValue(); } else { return result; } } Kòm yon rezilta nan lang sa a ki pa evidan, erè a genyen plas la dezyèm nan tèt la. 3rd plas. Tanpri, tanpri ale nan wòl ou! Now we move on to the award podium. The bronze medalist has been found in Tcheke fragman nan kòd la: Enfòmasyon public final class UsageType { .... public static final UsageType DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED = new UsageType( UsageViewBundle.messagePointer( "usage.type.delegate.to.another.instance.method.parameters.changed" ) ); private static final Logger LOG = Logger.getInstance(UsageType.class); public UsageType(@NotNull Supplier<....> nameComputable) { myNameComputable = nameComputable; if (ApplicationManager.getApplication().isUnitTestMode()) { String usageTypeString = myNameComputable.get(); if (usageTypeString.indexOf('{') != -1) { LOG.error(....); } } } .... } PvS-Study a avèti nan: Inicialize nan 'DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED' ap parèt anvan inicialize nan 'LOG'. Pwodwi pou Telefòn UsageType.java 46 Analizè a avèti sou yon depans siklik pandan inisyalizasyon jaden estati; youn nan nuans Java sa yo ki fasil manke. The constructor is used to initialize the field. And we access logger nan konstriktè sa a. DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED LOG Fields nan . As we can see, Li sitiye pi wo a , i.e. it's initialized earlier. As a result, when the constructor runs, , epi lè nou ap eseye aksè a li, nou pral jwenn yon NPE. are initialized in the order in which they're declared DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED LOG LOG will be null Kòm nan pifò ka ki anba a, reparasyon an pral trè senp. Nou jis bezwen mete Deklarasyon an pi wo a . LOG DELEGATE_TO_ANOTHER_INSTANCE_PARAMETERS_CHANGED 2nd plas. Ki kote te blòk la ale? Nou te deplase nan medayè a asye. Reyinyon nan mod Minecraft, . CustomNPC+ nan Tcheke fragman nan kòd la: public int range = 5; public int speed = 5; .... public boolean aiShouldExecute() { healTicks++; if (healTicks < speed * 10) return false; for (Object plObj : npc.worldObj.getEntitiesWithinAABB( EntityLivingBase.class, npc.boundingBox.expand( range, range / 2, // <= range)) ) { .... } healTicks = 0; return !toHeal.isEmpty(); } PvS-Study a avèti nan: Ekspresyon an te implisitman cast soti nan 'int' kalite a 'double' kalite a. Konsidere sèvi ak yon cast eksplisit kalite a pou evite pèdi nan yon pati fraksyon. Yon egzanp: doub A = (double)(X) / Y;. Pwodwi pou Telefòn JobHealer.java nan 41 In this code snippet, the game periodically (based on the field) scans for entities inside a rectangular area with a radius defined by , konsantre sou yon doktè NPC. speed range Since the Metòd la gen Signature, analizè a se absoliman dwa nan avèti sou fragman sa a: is passed to the method where "Se konsa, ki sa?" ou ka mande. Nou panse sa a se reyèlman enteresan, se konsa nou te deside envestigasyon nan ka sa a. expand expand(double x, double y, double z) int double Sa a defèt ti kras mennen nan konsekans sa a: si radyo a se yon nimewo etranj, lè evalye aks la Y, nou pèdi mwatye yon blòk nan tèt la ak nan anba a (i.e., yon blòk tout antye nan total). Nou te pwouve li pa vizyèlize bous la kolizyon ki konvèti soti nan radyo a. Look at the visualization: nan NPC doktè kolizyon se ki nan blan. The collision currently implemented (5 / 2) is highlighted in red. Kolizyon an san divizyon nèt (5 / 2.0) se ekleraj nan grenn. Kòm nou ka wè, si nou itilize Literal nan tip, divizyon an se pa ankò yon nimewo enteryè, ak kòm yon rezilta, kolizyon an pral kouvri eksakteman radyo a nou vle. 2.0 double And to confirm that it worked correctly, the author of the Li te gen pou "demande nan mond lan": Règleman Notably, developers have fixed this error in the original mod for Minecraft 1.12.2. Unfortunately, I can't provide any direct evidence, so let's say I asked the universe—and this code snippet is what it sent back: Remakab, devlopè yo te fikse erè sa a nan mod orijinal la pou Minecraft 1.12.2. Malgre ke, mwen pa ka bay nenpòt ki dokiman dirèk, se konsa di ke mwen te mande mond lan - ak sa a koutim kòd se sa li te voye tounen: .... this.npc.world.getEntitiesWithinAABB( EntityLivingBase.class, npc.getEntityBoundingBox().expand(range, range / 2.0, range) ); .... Kòm dev yo te fikse bug la nan modifikasyon orijinal la, menm bagay la ta dwe aplike isit la. Kòm dev yo te fikse bug la nan modifikasyon orijinal la, menm bagay la ta dwe aplike isit la. 1yèm plas: ka a mistè nan bonis manke Koulye a, meday la lò ap ale nan ... ! Ta ka gen anpil nan Minecraft bugs se paske mwatye ekip nou an te pase èdtan entelijan travay sou mods ak Plugins pou li? Ki konnen. CustomNPC+ Nou ale nan kòd la: .... int startIndex = -1; boolean number = false; try { startIndex = Integer.parseInt(bonusID); number = true; } catch (Exception var34) { number = false; } for (startIndex = 0; startIndex < bonuses.length; ++startIndex) { .... if (number && startIndex == startIndex || // <= !number && bonusValues[startIndex][0].equals(bonusID) ) { noNBTText = bonusValues[startIndex][0] + ";" + bonusValueString; bonuses[startIndex] = ""; bonuses[startIndex] = noNBTText; .... break; } } .... PvS-Study a avèti nan: V6001 Gen idantite sous-expressions 'startIndex' nan bò a ak bò a nan operatè a '=='. ScriptDBCPlayer.java 289 V6007 Ekspresyon an '!number' se toujou vre. ScriptDBCPlayer.java 289 V6033 An item with the same key 'startIndex' has already been changed. ScriptDBCPlayer.java 293 Èske alèt reyèlman sanble erè? E si sa, sa ki mennen nan? Isit la, yon tout enspeksyon detèktif ak yon fen enteresan ap tann nou. Premye, nou pral gade nan adrès an premye. Konpare Otè a enteresan a nan atik la, ki pote chape a detektè li yo ak mantal la long, ale pou rechèch pou pwen nan klas la. Evidans la se rete tou pre: startIndex Dosye : : ScriptDBCPlayer.java(224) .... int num = -1; boolean number; try { num = Integer.parseInt(bonusID); number = true; } catch (Exception var33) { number = false; } for (int i = 0; i < bonuses.length; ++i) { .... if (number && i == num || !number && bonusValues[i][0].equals(bonusID) ) { bonuses[i] = ""; break; } } .... Kòd la sanble trè menm jan an, men li se pa yon konvansyon ke nan ekip nou an, nou rele otè a nan atik la "The Keen Eye" - li te jwenn diferans la! Nan ka dezyèm, varyab yo se nan Blòk ak nan Loop: yo se ak Nan fragman an premye, nou premye inisyalize in the blòk, ak Lè sa a itere nan li nan yon loop. different try for num i startIndex try for Se poutèt sa, nan fragman an dezyèm, de varyab diferan se konpare nan yon tcheke identik: ak Nan premye a, nou gen sa ki analizè a montre- . num i startIndex == startIndex Se konsa, kounye a nou konnen ki jan fragman an premye ta dwe sanble. ? But what does the error impact Nan moman sa a, detektè a te wè yon pwen enpòtan nan non an nan klas la: prefix means that the class is used in the game scripting mechanism. The method with error is responsible for assigning bonuses to game attributes such as "Strength", "Agility", etc. Logically, the method is supposed to read a specific bonus index from the in-game script and then apply the corresponding modifier. So how should this have worked? Script Premyèman, nou bezwen analize indeks bonis nan block: try try { num = Integer.parseInt(bonusID); number = true; } .... Apre sa, nan bouch la, mete valè a pase nan bonis la: for (int i = 0; i < bonuses.length; ++i) { .... if (number && i == num || ....) { noNBTText = bonusValues[i][0] + ";" + bonusValueString; bonuses[i] = ""; bonuses[i] = noNBTText; .... break; } } Men, nan fragman an ak erè a, endèks la atribit ki te jwenn soti nan skript la se overwritten ak zèb ak Lè sa a, konpare ak tèt li: try { startIndex = Integer.parseInt(bonusID); number = true; } catch (Exception var34) { number = false; } for (startIndex = 0; startIndex < bonuses.length; ++startIndex) { .... if (number && startIndex == startIndex || // <= !number && bonusValues[startIndex][0].equals(bonusID) ) { noNBTText = bonusValues[startIndex][0] + ";" + bonusValueString; .... } } Sa vle di, valè a bonis pase nan skript la se toujou bay bonis paske Li te ekri nan kondisyon ak vin zèb, ak Lè sa a, se konpare ak tèt li. Koulye a, pwoblèm la se kristalman klè. Anseye konsekans yo nan erè a. first startIndex for First, we need to write an in-game script that will create bonuses for "Strength". Premye, nou kreye de bonis ak valè nan 1, ak Lè sa a mete valè yo nan 5 ak 15, respektivman: nan This is what in-game scripts look like. We created bonuses for "Strength" with indices 0 and 1, and then assigned them the values. Koulye a, nan teyori, si nou montre de bonis sa yo soti nan "Force", nou pral jwenn 5 ak 15? Si pa te gen okenn erè nan kòd la, sa a ta te pase. Sepandan, kòm nou te konprann soti nan blòk la pi wo a, erè a mennen nan valè a nan bonis la premye yo dwe overwritten. To confirm this behavior, let's write another in-game script that simply prints the bonus values: nan Kòm yon rezilta, nou jwenn: Indeed, the second bonus in "Power" also has an initial value of 1, while the first bonus now equals 15. It turns out that we first set the first bonus to 5, and then overwrite it with a value of 15. Our hypothesis above turns out to be true. The case has been solved. Dapre kantite travay detèktif ki gen rapò ak faktè a ke sa a bug ka repwodike konfyans nan pratik la, nou konfyans bay li Nan top 10 nou an! honorable first place Pwodwi pou Yay! We've made it through all ten of the most bizarre, heart-warming, and educational bugs, and we hope you enjoyed the journey as much as we did! If you have your own thoughts about this top, or maybe a favorite bug of your own, we'd be happy to see you share them in the comments. Si ou vle li plis sou tcheke lòt pwojè, nou envite ou nan or on . Blog nan Paj sa a Si ou santi ou enspire yo tcheke pwojè yo endividyèl ou ak vle eseye PVS-Studio analizè tèt ou, swiv . And if you're a student, teacher, or maintainer of open-source projects in C, C++, C#, or Java, you can use PVS-Studio for free. All the details are . Lyen isit la Tout sa ki rete se pou di adieu pou kounye a. Happy Holidays! See ya byen bonè!